Answers:
你的命令
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
。
您的问题尚不清楚,但是根据您提交的代码,您似乎希望变量check
存储grep
命令的退出状态。执行此操作的方法是运行
grep -ci 'text' file.sh
check=$?
从外壳运行命令时,可通过特殊的外壳参数来获得其退出状态$?
。
POSIX(类Unix操作系统的标准)在其Shell规范中对此进行了记录,而Bash实现在“ 特殊参数”下进行了记录。
由于您是新手,因此强烈建议您从一本好书和/或在线教程开始,以获取基础知识。在Stack Exchange网站上不建议外部资源,但我建议使用Lhunath和GreyCat的Bash指南。
您已经告诉bash check=grep
在传递给命令的环境中设置变量
-ci 'text' file.sh
但ci
不存在。
我相信您打算将该命令括在反引号内,或在括号前加一个美元符号,这两种方式都将指定在文件中(不区分大小写)在“文本”中找到多少行的计数:
check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)
$check
如果没有匹配项,则现在应为0;如果有任何匹配项,则应为正。
困惑为什么在检查输出时使用-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
$?
在命令完成后立即检查。