shell脚本中的比较

时间:2015-09-09 06:15:12

标签: linux shell unix logical-operators

我很难理解这一点。我认为,我可以编写一个返回代码比较,如下所示。哪个更好?为什么会这样?

RC=$?

if [[ $RC == '0' ]]; then
if [ $RC -eq '0' ]; then
if [ $RC == '0' ]; then
if [ "$RC" == "0" ]; then
if [ "$RC" -eq "0" ]; then
if [[ "$RC" == "0" ]]; then
if (( "$RC" == "0" )); then
if ( "$RC" == "0" ); then
if (( $RC == 0 )); then
if ( $RC == 0 ); then

还有一些......

如果RC="A" - 字符串?

怎么办?

2 个答案:

答案 0 :(得分:6)

以上都不是。在绝大多数情况下,您希望直接从if中检查退出代码。任何看起来像

的代码
command
RC=$?
if [ $RC == 0 ]; then

更优雅,更健壮,更具惯用性

if command; then

除非您特别需要检查结果代码的精确非零值。

要单独解决有关使用哪个比较运算符的问题,唯一完全可移植的变体是[ =。这个传统的Bourne shell运算符的语法不支持==的相等性,所以这是错误的(虽然有些shell允许它作为语法安全网)。 -eq运算符比较数字相等,而=执行字符串比较。

在现代shell中,[[((都是可行的,这取决于你是否更关心字符串比较(这是[[有意义的地方)还是算术(这是域名) (( - 如果比较涉及对数字的一些实际计算,则特别有用;但它绝对是更多边缘替代,因为它对字符串比较完全没有用)。 [[也支持模式匹配,因此您不仅限于静态字符串比较;与[不同,它需要一个双等号来进行字符串相等比较。它适用于[的许多棘手问题,包括但不限于使用不加引号的变量和以破折号开头的参数的正确行为。

使用单个括号的替代方法根本不能满足您的需求。它尝试在子shell中运行$RC作为命令。

答案 1 :(得分:1)

如果您在Bash,它不会通过类型隔离其变量,但是...... return code是一个数值,所以我将赌注:

rc=$?

if (( ! rc )); then
  # rc == 0
  Do something
fi

原因:与预期的type保持一致。

检查:http://tldp.org/LDP/abs/html/untyped.html