在ksh shell中,我想在运行命令后检查返回值,我写了两个样式:
if [ $? -ne 0 ] ; then
echo "failed!"
exit 1
else
exit 0
fi
[ $? -ne 0 ] && echo "failed!" && exit 1
Run Code Online (Sandbox Code Playgroud)
它们是等价的吗?如果没有,如果我想把它写成一行,我该怎么办?
它们很接近,但不一样.首先,即使由于某种原因失败,也if将执行; 链式表达不会.此外,链式版本缺乏相应的.exit 1echoelse exit 0
一个更好的等价物是这样的:
[ $? -ne 0 ] && { echo "failed!"; exit 1; } || exit 0
Run Code Online (Sandbox Code Playgroud)
这是标记的ksh,因此您可能会发现数字表达式语法更清晰:
(( $? )) && { echo "failed!"; exit 1; } || exit 0
Run Code Online (Sandbox Code Playgroud)
但是if如果你愿意的话,你也可以写一行:
if (( $? )); then echo "failed!"; exit 1; else exit 0; fi
Run Code Online (Sandbox Code Playgroud)
如果您刚刚在此表达式上方运行的命令为了设置$?很短,您可能只想将其直接用作if表达式 - 使用reverse子句,因为退出代码0为真:
if grep -q "pattern" /some/filename; then exit 0; else echo "failed!"; exit 1; fi
Run Code Online (Sandbox Code Playgroud)
这个简单的情况并不重要,但总的来说你可能想避免echo.相反,使用printf- 或者如果你不介意只使用ksh,你可以使用print.问题echo是它没有提供一种处理变量中奇怪字符串的方法:
$ x=-n
$ echo "$x"
$
Run Code Online (Sandbox Code Playgroud)
虽然两者printf并print做到:
$ printf '%s\n' "$x"
-n
$ print - "$x"
-n
Run Code Online (Sandbox Code Playgroud)
再说一次,这里不是问题,或者你只是打印出一个文字字符串,但我发现echo完全训练自己出于习惯更容易.