当我使用Bash自动执行操作时,我经常使用Unix命令的返回值来测试以下内容:如果文件中存在字符串(grep)或进程正在运行(ps aux + grep)。
这是一个例子,如果没有匹配则grep将返回1,如果至少有一个结果则返回0。
$ ps aux | grep process_that_doesntexist | grep -v grep
$ echo $?
1
$ ps aux | grep init | grep -v grep
root 1 0.0 0.1 135188 6660 ? Ss 01:43 0:00
$ echo $?
0
这是一个坏习惯/编程方式吗?以这种方式编写的bash脚本应该在生产服务器上运行吗?
感谢。
答案 0 :(得分:3)
点击ps
不是一个好习惯。如果您的操作系统提供了pgrep
,请使用grep
。
但是,通常,是的,使用退出状态来确定$?
是否已成功匹配内容是完全合适的。也就是说,而不是引用# When possible, do this:
if grep -q -e value <input; then
echo "found value" >&2
else
echo "did not find value" >&2
fi
,而是直接在您的条件中进行评估:
# ...not this:
grep -q -e value <input
if [ "$?" -eq 0 ]; then
echo "found value" >&2
else
echo "did not find value" >&2
fi
...而不是:
if COMMAND; then ...
这仍然具有相同的效果 - COMMAND
检查select start_date, lead(start_date) over (order by start_date) - 1 as end_date, value
from my_table
;
的退出状态 - 但没有额外的间接层。