bash脚本 - if语句检查语句是否返回数据

时间:2017-04-14 20:46:12

标签: bash scripting quoting

我是shell脚本的初学者,我正在尝试运行一个简单的脚本,该脚本使用locate命令搜索用户输入的文件。我正在尝试实现一个if语句,如果找到任何具有该名称的文件,则返回true并将其打印到命令行,但是我相信我的if语句中有错误?

#!/usr/bin/bash
echo -n "Enter filename: "
read fileToFind

 if [ -z $fileToFind ]
 then
     echo "Error! No filename entered]
 else
    fileSearch=`locate -i $fileToFind

    if [ $fileSearch ]
    then
         echo $fileSearch
    else
         echo "No such file"
    fi
fi

2 个答案:

答案 0 :(得分:1)

主要问题在于:

if [ $fileSearch ]

locate找到多个匹配的文件时,这会导致错误,因为[在为其提供多个字符串时需要一个字符串。

要防止这种情况,请引用变量:

if [ "$fileSearch" ]

你应该总是引用所有变量,除非你知道你不能这样做的事实。这是你的脚本,完整的引用:

#!/usr/bin/bash
echo -n "Enter filename: "
read fileToFind

 if [ -z "$fileToFind" ]                 # 1
 then
     echo "Error! No filename entered"
 else
    fileSearch=`locate -i "$fileToFind"` # 2

    if [ "$fileSearch" ]                 # 3
    then
         echo "$fileSearch"              # 4
    else
         echo "No such file"
    fi
fi

#1和#2有助于搜索带空格和特殊字符的文件。 #3确保您不会因多个文件而出错。 #4防止在一行中写出多个匹配。

答案 1 :(得分:1)

根据@ Cyrus的评论,我通过http://shellcheck.net运行了您的代码。结果如下:

#!/usr/bin/bash
echo -n "Enter filename: "
read -r fileToFind

 if [ -z "$fileToFind" ]
 then
     echo "Error! No filename entered"
 else
    fileSearch=$(locate -i "$fileToFind")

    if [ "$fileSearch" ]
    then
         echo "$fileSearch"
    else
         echo "No such file"
    fi
fi

请注意此网页上的语法突出显示。你的代码中有很多红色/洋红色。这表明你还没有在某个地方关闭报价。

现在回答你的问题:

  

我试图实现if语句,如果有任何文件则返回true   找到该名称并将其打印到命令行...

这是您可能感兴趣的样式:如果正在执行的命令返回0退出代码(即成功返回),则if语句将评估为true。对于locate(基于我在https://linux.die.net/man/1/locate的广泛研究),如果返回文件,locate会认为调用成功。 locate还会将结果输出到命令行(或linux用法中的stdout)。总而言之,你可以像这样重写你的if语句:

    # other code omitted for focus/brevity
    if 
        ! locate -i "$fileToFind"
    then            
         echo "No such file"
    fi

在这种情况下,我用!来否定了结果。因此,如果locate找不到文件,您的程序将输出"没有这样的文件"。如果locate确实找到了该文件,locate会将其输出到stdout。

编写此代码有一种稍微简单的方法:

locate -i "$fileToFind" || echo "No such file"

在上面的陈述中,您要求bash评估逻辑OR ||具有短路逻辑。表达式为true后,bash将停止执行语句。因此,在上面的情况中,如果locate成功并找到一个文件,bash将不会在||之后执行正确的表达式。这是一个简洁的成语,写作很有趣,但对其他人来说可能有点难以理解。 if语句通常更清楚地表达你的逻辑,并坚持如果。