这是我当前拥有的(顶部 bash 窗口)和语法返回的结果(底部 bash 窗口)。
当名称不存在时,例如“xyz”,它会返回适当的响应。
当名称确实存在时,例如“joel”,它会在提供正确的响应之前回显不需要的响应。
我缺少什么?
name=$1
OUTPUT=$(grep -i $name ~uli101/2016c/phonebook)
if [ "$name" = "" ]
then echo -n "Enter a name to search for: "
read name
fi
if [ $? -ne 1 ]
then echo "Name $name not in directory"
fi
grep -i $name ~uli101/2016c/phonebook
~
:~/scripts> phone4 xyz
Name xyz not in directory
:~/scripts> phone4 joel
Name joel not in directory
SHAPRIO JOEL SH 4802 BUSINESS STUDIES DIVISION
:~/scripts>
答案1
您的脚本报告未找到该名称,然后报告该名称存在。这是因为你的病情if [ $? -ne 1 ]
。 “$?”表示脚本中最后一个表达式的返回码。在本例中,它是前一个“if”块的返回代码。
要获得所需的结果,请将“grep”命令移动到第一个和第二个“if”块之间。这样第二个“if”将评估 grep 的结果。如果 grep 找到结果,它将打印该结果,并且返回码将为 0,并且该块将被跳过。如果 grep 没有找到结果,它应该不打印任何内容,并且返回码将为 1,从而导致执行条件。
答案2
并非所有版本grep知道关于-q 我使用的一个小技巧 - 当我只对命令的状态感兴趣时,就是在命令前加上“nohup”前缀 - 因为我很懒,忘记了“重定向方式”
诺哈普方式
nohup grep -i string_arg file_args >/dev/null
status=$?
重定向方式
grep -i string_arg file_args 2>&1 >/dev/null
status=$?