linux的shell命令中grep命令返回值问题
- 如何查看上一个命令退出状态?
- $?的作用
- set -e的作用
- 一个代码例子
- shell脚本中的错误示例
如何查看上一个命令退出状态?
$?的作用
$? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。
所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1,这和C语言的 main() 函数是类似的。
不过,也有一些命令返回其他值,表示不同类型的错误。
set -e的作用
set命令的-e参数,linux自带的说明如下:
“Exit immediately if a simple command exits with a non-zero status.”
也就是说,在"set -e"之后出现的代码,一旦出现了返回值非零,整个脚本就会立即退出。有的人喜欢使用这个参数,是出于保证代码安全性的考虑。但有的时候,这种美好的初衷,也会导致严重的问题。
一个代码例子
可以看到1.txt文件中没有c字母,而当我执行命令后,虽然没显示内容,但是命令返回的执行状态码确实1,也就是失败。当我grep存在的内容时,显示的是正确的退出状态0
shell脚本中的错误示例
脚本代码:
#!/bin/bash
set -e
sudo cat ~/jars/1.txt | grep "c"
if [ $? -eq 1 ];then
echo "aa"
else
echo "bb"
fi
这段代码的功能是根据判断是否有这个文件,以及文件内是否有内容c字符,如果都满足,才会执行输出aa,否则输出bb。但是脚本开头又写了set -e,标识遇到命令退出状态错误时,立即停止脚本执行。所以大家应该也知道了,此时if这块的内容就完全不会执行了。