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

omr*_*har 18 command-line shell grep bash exit-status

几天前我开始学习 Bash。

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

check=grep -ci 'text' file.sh
Run Code Online (Sandbox Code Playgroud)

我得到的输出是

No command '-ic' found
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 34

你的命令,

check=grep -ci 'text' file.sh
Run Code Online (Sandbox Code Playgroud)

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


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

grep -i 'PATTERN' file
check=$?
Run Code Online (Sandbox Code Playgroud)

如果你想对这个值采取行动,你可以使用你的check变量:

if [ "$check" -eq 0 ]; then
    # do things for success
else
    # do other things for failure
fi
Run Code Online (Sandbox Code Playgroud)

或者你可以跳过使用单独的变量而不得不一起检查$?

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

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

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

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

$?仅当您稍后需要使用它时才需要保存到另一个变量中,当 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
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中,$?将被[ "$err" -ne 0 ] && [ ! -d "$dir" ]测试结果覆盖。只有在我们需要显示它并将它与exit.


Mon*_*der 8

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

-ci 'text' file.sh

ci不存在。

我相信您的意思是将该命令括在反引号中,或者括在前面带有美元符号的括号中,这两者都将分配在文件中(不区分大小写)找到多少行“文本”的计数:

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

check=$(grep -ci 'text' file.sh)
Run Code Online (Sandbox Code Playgroud)

$check如果没有匹配项,现在应该是 0,如果有任何匹配项,则应该是正数。