我对脚本编写相当陌生,我想学习如何检查值来$?
检查 grep 命令是否成功,如果grep 命令是不成功,然后回显包含以下值的消息$名称。我怎样才能实现这一点,我知道我可以使用 If 语句和特殊的 shell 变量,但我不知道正确的语法。我在下面的代码中尝试了一下。
name=$1
if [ "$name" = "" ]
then echo -n "Name 'DBS' is not in directory"
read name
fi
grep -i $name mike ~admin/dbs/email
grep -i goodman ~admin/dbs/passwd
答案1
这是一些相当典型的语法。它可以进行更多的错误检查,但在您想要做的范围内,我相信这将帮助您走上正确的轨道:
#!/bin/bash
file=/etc/hosts
if [ -z "$1" ]; then
echo Usage: $0 name 1>&2
exit 2
fi
if grep -q "$1" $file ; then
echo "$file" contains $1
else
echo "$file" doesn\'t contain $1
fi
笔记
- 如果(第一个命令行参数)是空字符串(或未提供),则第一个
test
(if [ -z "$1" ]; then ...
) 为 true 。$1
- 该
Usage:
行输出stderr
到1>&2
- 其本身的输出
grep
是隐藏的(除了错误输出,您可能想看到它),因为在这种情况下我们只想知道它是否成功(找到匹配)。grep
有一个参数-q
可以使所有输出静音,这是这里更好的选择,但并非所有命令都有“安静”开关,在这些情况下,您可以使用>/dev/null
它,如下面的示例所示。
具体示例与$?
您特别要求提供一个示例$?
。if grep ...
我们确实可以将其拆分为单独的语句,而不是上述构造:
# grep -q "$1" $file would work just as well, here (better, maybe!):
grep "$1" $file >/dev/null
if [ $? -eq 0 ]; then
echo "$file" contains $1
else
echo "$file" doesn\'t contain $1
fi
请务必注意,测试$?
必须在相关命令之后立即进行,因为任何其他命令(不包括某些 shell 内置命令)都会导致该值被覆盖。
什么是$?
$?
只是 shell 执行的最后一个进程(命令)的退出代码。按照惯例,0
退出代码表示成功(尽管与大多数惯例一样,也有例外)。更高的退出代码可能具有特定于应用程序的各种含义,但通常非零表示某种异常退出。有关更多信息,请参阅该命令的文档。
进一步阅读
答案2
另一种快速方法,可以避免 if 语句以及$?
,但非常好且简短(oneliner!),在我看来,将是:
grep -q $name $file || echo "$name not found."
如果你想echo
返回grep
:0
grep -q $name $file && echo "$name found."
并作为 if-else-statemet:
grep -q $name $file && echo "$name found." || echo "$name not found."