使用if语句中的退出状态进行Bash脚本编制

时间:2014-11-30 00:27:39

标签: linux bash

可能是一个新手问题,但无论如何我在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 没有。

4 个答案:

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