如何计算目录中的文件并在if语句中进行测试?

时间:2019-05-17 03:37:30

标签: linux bash

请记住,我是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:预期为整数表达式

2 个答案:

答案 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
}

>&2printf的输出定向到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