Bash脚本检查条件

时间:2016-09-30 10:01:46

标签: linux bash scripting

我是新手来编写脚本并尝试编写以下简单的

function wait_some {
    if [ -z $1 ];
        echo some_string
        then if ! [[ $1 =~ ^[0-9]+([.][0-9]+)?$ ]];
        then
            echo "$1 is not a number"
            exit 2
        else echo "it's a number"
        fi
    fi
}

wait_some 2.2 //prints some_string and then it's a number

这可以按预期工作。

但如果我删除了回声"某些字符串'它什么都不打印:

function wait_some {
    if [ -z $1 ];
        then if ! [[ $1 =~ ^[0-9]+([.][0-9]+)?$ ]];
        then
            echo "$1 is not a number"
            exit 2
        else echo "it's a number"
        fi
    fi
}

wait_some 2.2 //prints nothing

为什么呢?为什么在条件检查中删除函数后立即删除echo some_string

1 个答案:

答案 0 :(得分:2)

这是因为if-conditionbash中作为复合语句执行,即 command1 ; command2 以及测试运算符中-z的使用不正确。

我将通过两个示例的set -x选项进行调试来解释它。

为了成功,这就是执行顺序

++ wait_some 2.2
++ '[' -z 2.2 ']'
++ echo some_string
some_string

正如您所看到的,执行[ -z 2.2 ]的两个条件失败了。但为什么?因为字符串具有非零长度(See how -z works)并且检查导致条件失败,该条件应该是[ ! -z 2.2 ]。它并没有结束。

由于您使用的命令组合, command1 ; command2 command1 失败的if-condition,现在 command2 只是一个简单的echo成功运行,返回正值,使整体if-condition成功,导致正则表达式搜索,您可以看到后续的echo'ed语句。

现在针对失败案例,set -x的扩展结果看起来像

++ wait_some 2.2
++ '[' -z 2.2 ']'

正如您所看到的,在删除echo语句时,if-condition的整体返回代码已变为false,内部条件根本不会被执行。同样删除echo语句类似于在脚本中实际添加false运算符,如

if [ -z $1 ];
    false

将扩展为

++ wait_some 2.2
++ '[' -z 2.2 ']'
++ false

导致你的病情失败。您的脚本应该编码的理想方式类似于

#/bin/bash

# See the updated if-condition and code reorganization

function wait_some { 
    if [ ! -z "$1" ];                            
    then
       if ! [[ $1 =~ ^[0-9]+([.][0-9]+)?$ ]];
        then
            echo "$1 is not a number"
            exit 2
        else echo "it's a number"
        fi
    fi
}

wait_some 2.2

关于您的错误,最好的事情是http://www.shellcheck.net/无法识别if-condition中的错误语法,并断言该脚本没有任何问题。