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.
您已经告诉 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,如果有任何匹配项,则应该是正数。