我是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
答案 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语句通常更清楚地表达你的逻辑,并坚持如果。