为了回显特定的输出,在if语句中检查退出状态的最佳方法是什么?
我想的是:
if [ $? -eq 1 ]
then
echo "blah blah blah"
fi
我还遇到的问题是,退出语句是在if语句之前,因为它必须有退出代码。此外,我知道我做错了什么,因为退出显然会退出程序。
为了回显特定的输出,在if语句中检查退出状态的最佳方法是什么?
我想的是:
if [ $? -eq 1 ]
then
echo "blah blah blah"
fi
我还遇到的问题是,退出语句是在if语句之前,因为它必须有退出代码。此外,我知道我做错了什么,因为退出显然会退出程序。
当前回答
下面的测试脚本
简单的bash测试命令 多个测试命令 Bash测试命令包括管道:
if [[ $(echo -en "abc\n def" |grep -e "^abc") && ! $(echo -en "abc\n def" |grep -e "^def") ]] ; then
echo "pipe true"
else
echo "pipe false"
fi
if [[ $(echo -en "abc\n def" |grep -e "^abc") && $(echo -en "abc\n def" |grep -e "^def") ]] ; then
echo "pipe true"
else
echo "pipe false"
fi
输出结果为:
pipe true
pipe false
其他回答
运行的每个命令都有一个退出状态。
该检查将查看在该行运行之前最近完成的命令的退出状态。
如果你想让你的脚本在测试返回true时退出(之前的命令失败),那么你可以在回显之后的If块中放入exit 1(或其他任何东西)。
话虽如此,如果您正在运行该命令并希望测试其输出,那么使用下面的方法通常更直接。
if some_command; then
echo command returned true
else
echo command returned some error
fi
或者把它转过来用!的否定
if ! some_command; then
echo command returned some error
else
echo command returned true
fi
但是请注意,它们都不关心错误代码是什么。如果你知道你只关心一个特定的错误代码,那么你需要检查$?手动。
$ ?是与其他参数相同的参数。您可以在最终调用exit之前保存它的值以供使用。
exit_status=$?
if [ $exit_status -eq 1 ]; then
echo "blah blah blah"
fi
exit $exit_status
下面的测试脚本
简单的bash测试命令 多个测试命令 Bash测试命令包括管道:
if [[ $(echo -en "abc\n def" |grep -e "^abc") && ! $(echo -en "abc\n def" |grep -e "^def") ]] ; then
echo "pipe true"
else
echo "pipe false"
fi
if [[ $(echo -en "abc\n def" |grep -e "^abc") && $(echo -en "abc\n def" |grep -e "^def") ]] ; then
echo "pipe true"
else
echo "pipe false"
fi
输出结果为:
pipe true
pipe false
为了记录,如果脚本使用set -e(或#!/bin/bash -e),因此不能检查$?直接(因为脚本会在任何返回代码上终止,而不是0),但想要处理特定的代码,@gboffis注释很好:
/some/command || error_code=$?
if [ "${error_code}" -eq 2 ]; then
...
注意,退出代码!= 0用于报告错误。所以,最好这样做:
retVal=$?
if [ $retVal -ne 0 ]; then
echo "Error"
fi
exit $retVal
而不是
# will fail for error codes == 1
retVal=$?
if [ $retVal -eq 1 ]; then
echo "Error"
fi
exit $retVal