这是使用bash返回代码编程的好方法吗?

时间:2016-11-18 02:36:49

标签: linux bash shell unix



当我使用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脚本应该在生产服务器上运行吗?

感谢。

1 个答案:

答案 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 ; 的退出状态 - 但没有额外的间接层。