我是新手来编写脚本并尝试编写以下简单的
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
?
答案 0 :(得分:2)
这是因为if-condition
在bash
中作为复合语句执行,即 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
中的错误语法,并断言该脚本没有任何问题。