如何将命令的退出状态提取到变量中?


14

我几天前开始学习Bash。

我正在尝试将grep表达式的退出状态获取为这样的变量:

check=grep -ci 'text' file.sh

我得到的输出是

No command '-ic' found

我应该用管道命令来做吗?


6
对于退出状态,您可以$?在命令完成后立即检查。
coffeMug

如果需要管道中命令之一的状态,则可以检查PIPESTATUS数组。
cas

Answers:


26

你的命令

check=grep -ci 'text' file.sh

Shell将解释为“ -ci使用参数text和来运行命令,并将变量file.sh设置为其环境中check的值grep”。


Shell将最近执行的命令的退出值存储在变量中?。您可以将其值分配给自己的变量之一,如下所示:

grep -i 'PATTERN' file
check=$?

如果要对此值执行操作,则可以使用check变量:

if [ "$check" -eq 0 ]; then
    # do things for success
else
    # do other things for failure
fi

或者您可以跳过使用单独的变量,而不必一起检查$?所有变量:

if grep -q -i 'pattern' file; then
  # do things (pattern was found)
else
  # do other things (pattern was not found)
fi

(请注意-q,它指示grep不输出任何内容,并在出现匹配项时立即退出;我们对此处的匹配项并不感兴趣)

或者,如果你只是想“做事”图案时,发现:

if ! grep -q -i 'pattern' file; then
  # do things (pattern was not found)
fi

$?仅当以后需要使用它(当in的值$?被覆盖时)时,才需要将其保存到另一个变量中,例如

mkdir "$dir"
err=$?

if [ "$err" -ne 0 ] && [ ! -d "$dir" ]; then
    printf 'Error creating %s (error code %d)\n' "$dir" "$err" >&2
    exit "$err"
fi

在以上代码段中,测试$?结果将覆盖该代码段[ "$err" -ne 0 ] && [ ! -d "$dir" ]。实际上,仅在需要显示它并将其与结合使用时才需要将其保存在此处exit


4

您的问题尚不清楚,但是根据您提交的代码,您似乎希望变量check存储grep命令的退出状态。执行此操作的方法是运行

grep -ci 'text' file.sh
check=$?

从外壳运行命令时,可通过特殊的外壳参数来获得其退出状态$?

POSIX(类Unix操作系统的标准)在其Shell规范中对此进行了记录,而Bash实现在“ 特殊参数”下进行了记录。

由于您是新手,因此强烈建议您从一本好书和/或在线教程开始,以获取基础知识。在Stack Exchange网站上不建议外部资源,但我建议使用Lhunath和GreyCat的Bash指南


4

您已经告诉bash check=grep在传递给命令的环境中设置变量

-ci 'text' file.sh

ci不存在。

我相信您打算将该命令括在反引号内,或在括号前加一个美元符号,这两种方式都将指定在文件中(不区分大小写)在“文本”中找到多少行的计数:

check=`grep -ci 'text' file.sh`

check=$(grep -ci 'text' file.sh)

$check如果没有匹配项,则现在应为0;如果有任何匹配项,则应为正。


1

困惑为什么在检查输出时使用-c?它用于检查匹配的次数-成功与否。

   -c, --count
          Suppress normal output; instead print a count of matching  lines
          for  each  input  file.  With the -v, --invert-match option (see
          below), count non-matching lines.  (-c is specified by POSIX.)

但是在这个例子中

check="$(grep --silent -i 'text' file.sh; echo $?)"

除了退出代码,它什么都不输出,然后退出。这是变量检查使用的输出。我也喜欢它,因为它是一行。

您可以将-silent替换为-q。我使用它是因为您对grep输出不感兴趣,无论它是否起作用。

   -q, --quiet, --silent
          Quiet;  do  not  write  anything  to  standard   output.    Exit
          immediately  with  zero status if any match is found, even if an
          error was detected.  Also see the -s  or  --no-messages  option.
          (-q is specified by POSIX.)

$ check=$(echo test | grep -qi test; echo $?) # check variable is now set
$ echo $check
0
$ check=$(echo null | grep -qi test; echo $?)
$ echo $check
1

1

将grep命令的输出分配给变量的正确方法是@ monty-harder提到的:

check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)

尽管要将此命令的退出状态分配给变量,您必须$?在执行命令后立即使用shell参数,如下所示:

grep -ci 'text' file.sh
check=$?
echo $check
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.