可能是一个新手问题,但无论如何我在linux / unix类的介绍中都涉及bash脚本,并且在我遇到的一个问题中,它让我编写了一个脚本,所以如果用户搜索文件中的名称那不存在它会输出一条消息说' your_input 不在目录'
它表示使用if
语句和退出状态$?
。
到目前为止,我得到了输入部分,但如果可能的话,我不确定如何在$?
语句中正确使用if
。
#!/bin/bash
name=$1
if [ "$name" = "" ]
then echo -n "Enter a name to search for: "
read name
fi
grep -i $name ~uli101/2014c/phonebook
if [ "$?" < "0" ]
then echo "error"
fi
我收到错误:
./ phone4:第14行:0:没有这样的文件或目录
我的问题是:我如何使用$?
和if
语句,如果我不能,你能解释一下如何在这个问题中使用$?
吗?
注意:我确实使用echo $?
来查看$?
如果grep
工作时 0 如何, 1 没有。
答案 0 :(得分:3)
其中有两个漏洞。您已经看到的是[]
表达式中<
被解释为&#34;小于&#34;但作为流重定向运算符。原因是[
只是另一个程序(test
的别名),因此[ "$?" < "0" ]
类似于cat < filename
。另一个错误是你不想检查&#34;少于&#34;但是对于&#34;不等于&#34;。总之:
if [ "$?" < "0" ]
应该是
if [ "$?" -ne "0" ]
或者你可以写
if ! grep "$name" ~uli101/2014c/phonebook
...因为if
将返回代码零解释为true而其他所有内容都解释为false。
答案 1 :(得分:0)
我所要做的就是:
if [ "$?" = "1" ]
then echo "error"
fi
几乎我一直在想它,我只需要说是否$? = 1那么错误,因为在读数中它说$?可能大于1我试图弥补这一点。
答案 2 :(得分:0)
应该是
if [ "$?" -gt 0 ]
符号'&lt;'是一个重定向操作符,它不是Python或C - shell脚本中的所有内容都是一个命令,包括'if'之后的文本,并且您正在执行一个名为'['的命令,您可以在该位置找到它/ usr / bin / [,此命令使用-gt和-lt参数来比较数字,而不是'&gt;'和'&lt;',它们是特殊的shell运算符。
您可以像这样重写此代码:
if grep -i "$name" ~uli101/2014c/phonebook
then true # 'true' is also a command, which does nothing and returns success
else echo "Error"
fi
甚至是这样,使用'||' operator,仅当前一个命令返回错误时才执行以下命令:
grep -i "$name" ~uli101/2014c/phonebook || echo "Error"
答案 3 :(得分:0)
“$?”不需要引号,因为它确实是一个数字。如果您想要更好的脚本,请检查电话簿文件的存在,并在询问名称输入之前退出,如果文件丢失。此外,如果您在READ命令上没有回复任何内容(仅输入),则可能需要执行某些操作。
#!/bin/bash
name=$1
phonebook=~/phonebook
if [ "$name" = "" ]
then
echo -n "Enter a name to search for: "
read name
fi
grep -i "$name" $phonebook
if [ $? -gt 0 ]
then
echo "error, no \"$name\" in $phonebook"
fi