运算符!=在shell脚本中是什么意思?

时间:2013-11-19 15:42:04

标签: bash shell if-statement scripting

在这个我的第二个if语句中有一个惊叹号,为什么要使用它。

#!/bin/bash

name=$1
if [ "$name" = "" ]
then echo -n "Enter a name to search for: "
     read name
fi

grep -i cheryl ~uli101/uli101/phonebook
grep -i $name ~uli101/uli101/phonebook

if [ "$?" != "0" ]
then echo -n "Name '$name' not in directory "
fi

2 个答案:

答案 0 :(得分:1)

特殊shell参数$?包含上次命令运行的退出代码。从shell运行的每个命令在完成运行时都会将数字状态报告给shell;通常,值为0表示命令成功,非零值表示失败。

grep命令在文件中搜索与模式匹配的行。如果它找到任何匹配的行,它会将它们打印出来,但如果它找到至少一个匹配,它也会以状态0退出,如果找不到任何匹配则退出非零状态。

语法[ 表达式 ]是一个命令,用于评估给定的表达式(通常是某种比较)以查看它是否为真。实际上,它只是另一个shell命令,如果表达式为真则退出状态0,如果为假则退出1; shell中的if构造根据$?的值决定要执行的操作。

!=运算符意味着'不等于',所以[ $? != 0 ]正在检查是否$?不等于零。

将所有这些放在一起,上面的代码会检查grep是否找到了匹配项。

!=的起源是C系列编程语言,其中感叹号通常表示“不”。在bash中,命令开头的!将反转命令的退出状态,将非零值变为零并将零归零。所以你也可以“移动感叹号”并重写上面的表达式:

if ! [ $? == 0 ]

但是,由于if本身基于退出状态运行,因此上述所有代码都在进行额外的工作。您可以跳过中间人,直接测试grep

if ! grep -i "$name" ~uli101/uli101/phonebook; then
   echo "Name '$name' not in directory."
fi

请注意,我在$name周围加上双引号,这可以防止值中的任何空格将其分隔为grep的多个参数。

答案 1 :(得分:0)

[ "$?" != "0" ]表示“$?不等于0”。请参阅Bash测试运算符here的完整列表。

请注意,如果$?找到匹配项,grep将设置为0,否则1将设置为{{1}}。