请记住,我是bash的新手(大约3天之内),我正在尝试计算特定目录中的文件数量,并检查是否有5个以上的文件,但是当我运行代码时下面,我返回一个值类型不匹配错误,并且我无法弄清楚如何解决它或运行完成相同任务的不同代码。有提示或修正吗?
我试图通过数学方程式重新分配变量以进行转换 我还尝试搜索类似的内容,但找不到任何内容
cd /mnt/Backlog/MSFB #Change into directory to count files
backupCount= find . -type f | wc -l #Count files and store in a variable
if [ backupCount -ge 5 ];
then
echo "More than 5 archives found!"
else
echo "Testing"
fi
我想要的是if语句,用于检查backupCount的值以及它是否大于5以显示一条消息(出于测试目的) 我得到的是一个错误消息:backupCount:预期为整数表达式
答案 0 :(得分:1)
嗯,你到那儿了。为了将命令的结果保存为变量的内容,请使用格式为var=$(command)
的命令替换。因此,在您的情况下:
backupCount=$(find . -type f | wc -l) #Count files and store in a variable
要引用存储在变量中的值,必须通过将'$'
放在变量前面来取消引用,例如
if [ "$backupCount" -ge 5 ];
还请注意,在使用[ ... ]
时,必须对变量加双引号。
(注意:,您收到错误"integer expression expected"
,因为您使用backCount
比较了[ ... ]
内有-ge
,而bash没有知道backupCount
是因为没有被取消引用,就像使用dogs -ge 5
一样,bash不知道"dogs"
是什么,因此抛出错误"integer expression expected"
)
您还可以使用POSIX算术运算符(( ... ))
进行比较,例如
if (( backupCount > 5 ));
在((...))
内,您不需要'$'
来取消引用变量。
您还希望在脚本的任何关键步骤中包括验证。例如,当您更改目录时,您想知道已创建目录。您可以简单地做到:
cd /mnt/Backlog/MSFB || exit 1
要在出现故障时立即退出,或者您可以添加一条错误消息以告诉您发生了什么故障,例如
cd /mnt/Backlog/MSFB || {
printf "error: failed to change to /mnt/Backlog/MSFB\n" >&2
exit 1
}
>&2
将printf
的输出定向到stderr
而不是stdout
。错误消息通常显示在stderr
上。 (如果需要再备份1步,则有3个主要流,stdin
(输入-0
),stdout
(输出-1
)和{{1 }}(错误-stderr
)。
答案 1 :(得分:0)
变量名和命令之间不能有空格。
命令也需要用''或放在$()
中backupCount=`find . -type f | wc -l`
# same as
backupCount=$(find . -type f | wc -l)
对于访问变量,您需要在变量名称前加上$。
if [ $backupCount -ge 5 ];
(尽管这是一种很好的做法)(可选),您可以在变量调用中使用双引号。
if [ "$backupCount" -ge 5 ];
这样做的原因是,当您的变量为空时,expession评估为if [ -ge 5 ];
,这会产生错误,而引号有助于避免此类错误。
最终脚本如下:
#!/bin/bash
backupCount=`find . -type f | wc -l` #Count files and store in a variable
if [ "$backupCount" -ge 5 ];
then
echo "More than 5 archives found!"
else
echo "Testing"
fi