在这个我的第二个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
答案 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}}。