在简单的 bash 脚本中使用 find 命令和 if 语句

Posted

技术标签:

【中文标题】在简单的 bash 脚本中使用 find 命令和 if 语句【英文标题】:Use find command and if statement in a simple bash script 【发布时间】:2020-06-08 00:24:58 【问题描述】:

我在 /root/xml-test/ 中有一个目录,其中包含 .xml 文件,每个文件大小为 99MB。

我正在使用if <i>TEST</i> 语句来检查大小是否大于$a

问题是...... if 语句总是导致 A 大于 B - 即使我为 A 选择了一个较小的数字 - 例如 1。

这是测试自己的脚本。 cmets 中有一个 URL,可以为您的测试创建任意大小的文件。

#!/bin/bash

#This will check the size of the XML files in /root/xml-test


# Script Test Procedures
# Create file of any size
#https://www.ostechnix.com/create-files-certain-size-linux/

xmlpath='/root/xml-test/.'

size=$(find $xmlpath -type f -name '*.xml' -exec du -c  + | grep total$) ; total=$(echo $size |  cut -c 1- | rev | cut -c 7- | rev)

b=$total
echo $total 'size in blocks' &&  echo "enter a second number";'

read a ;
echo "a=$a";
echo b=$total;

if [ $a > $b ];
then
    echo "a is greater than b";
else
    echo "b is greater than a";
fi;

【问题讨论】:

shellcheck.net 验证您的脚本。 [ $a &gt; $b ] 创建了一个文件名,如果文件已经存在则截断, 查看find-printf 选项及其%s 格式说明符(大小以字节为单位)。 [ $a &gt; $b ] 根本不做你想做的事; &gt; 被视为输出重定向而不是比较运算符。 [ $a \&gt; $b ] 更接近,但它进行词法比较而不是数字比较(即[ 10 \&gt; 2 ] 为假,因为在字符排序顺序中“1”在“2”之前)。此外,没有双引号的变量引用可能会产生奇怪的效果。你真正想要的是[ "$a" -gt "$b" ]total$ 也应该用引号引起来(可能是单引号,所以 $ 不能被误认为是 shell 语法)。而且(讨厌)你不需要在行尾使用分号。 我已经修复了代码块格式;语法高亮使现在更加明显,因为那里有一个杂散的单引号。 【参考方案1】:

在@gordon-davisson 的帮助下,该问题的解决方案正在改变以下内容:

if [ $a &gt; $b ];

if [ $a \&gt; $b ];

A 现在大于 B

B 可以大于 A

干得好!

【讨论】:

>你真正想要的是[ "$a" -gt "$b" ]total$ 也应该用引号引起来(可能是单引号,所以 $ 不能被误认为是 shell 语法)。而且(讨厌)你不需要在行尾使用分号。我也将对此进行测试... 现在您也应该应用其余的建议:使用 -gt 而不是 \&gt; 进行数值比较,并引用您的变量。【参考方案2】:

正确的解法是整数与整数的比较:

[ "$a" -gt "$b" ]

手册页将带有-gt 选项的test 命令定义为:

   INTEGER1 -gt INTEGER2
          INTEGER1 is greater than INTEGER2

【讨论】:

以上是关于在简单的 bash 脚本中使用 find 命令和 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 bash 脚本中使用 find 命令检查目录大小

如何在 bash 脚本中处理 find 的结果?

Bash 脚本 - 需要 find 命令来输出用双引号括起来的文件路径而没有换行符

Linux 第17天 bash,find,正则,命令历史

在 bash 循环中执行时查找“找不到命令”

bash脚本之函数简单介绍应用及函数的简单递归调用