如何在 If then 语句中使用特殊的 shell 变量

如何在 If then 语句中使用特殊的 shell 变量

我对脚本编写相当陌生,我想学习如何检查值来$?检查 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:行输出stderr1>&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退出代码表示成功(尽管与大多数惯例一样,也有例外)。更高的退出代码可能具有特定于应用程序的各种含义,但通常非零表示某种异常退出。有关更多信息,请参阅该命令的文档。

进一步阅读

测试(1)

答案2

另一种快速方法,可以避免 if 语句以及$?,但非常好且简短(oneliner!),在我看来,将是:

grep -q $name $file || echo "$name not found."

如果你想echo返回grep0

grep -q $name $file && echo "$name found."

并作为 if-else-statemet:

grep -q $name $file && echo "$name found." || echo "$name not found."

相关内容