在简单的 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 > $b ]
创建了一个文件名,如果文件已经存在则截断,
查看find
的-printf
选项及其%s
格式说明符(大小以字节为单位)。
[ $a > $b ]
根本不做你想做的事; >
被视为输出重定向而不是比较运算符。 [ $a \> $b ]
更接近,但它进行词法比较而不是数字比较(即[ 10 \> 2 ]
为假,因为在字符排序顺序中“1”在“2”之前)。此外,没有双引号的变量引用可能会产生奇怪的效果。你真正想要的是[ "$a" -gt "$b" ]
。 total$
也应该用引号引起来(可能是单引号,所以 $
不能被误认为是 shell 语法)。而且(讨厌)你不需要在行尾使用分号。
我已经修复了代码块格式;语法高亮使现在更加明显,因为那里有一个杂散的单引号。
【参考方案1】:
在@gordon-davisson 的帮助下,该问题的解决方案正在改变以下内容:
if [ $a > $b ];
if [ $a \> $b ];
A 现在大于 B
B 可以大于 A
干得好!
【讨论】:
>你真正想要的是[ "$a" -gt "$b" ]
。 total$
也应该用引号引起来(可能是单引号,所以 $ 不能被误认为是 shell 语法)。而且(讨厌)你不需要在行尾使用分号。我也将对此进行测试...
现在您也应该应用其余的建议:使用 -gt
而不是 \>
进行数值比较,并引用您的变量。【参考方案2】:
正确的解法是整数与整数的比较:
[ "$a" -gt "$b" ]
手册页将带有-gt
选项的test
命令定义为:
INTEGER1 -gt INTEGER2
INTEGER1 is greater than INTEGER2
【讨论】:
以上是关于在简单的 bash 脚本中使用 find 命令和 if 语句的主要内容,如果未能解决你的问题,请参考以下文章