双括号if语句不起作用

时间:2016-03-17 14:39:53

标签: bash

if [[ $nb_dd > 0 ]]; then
    INPUT_TYPE="txt"
fi

if [ $nb_dd > 0 ]; then
    INPUT_TYPE="txt"
fi

第一次检查(使用双括号)无法执行,导致脚本在错误时退出,因为$INPUT_TYPE未填充 - 但后一版本(单括号)正常工作,正确设置$INPUT_TYPE。这是为什么?

我正在运行OS X(10.11.4)(echo $SHELL = /bin/bash) - 这是来自广泛分布的工具套件,这些工具假设是在Linux平台上构建的 - 而.sh脚本则适用于作者所以它可能是一个特定于平台的问题,虽然我想不出原因。

2 个答案:

答案 0 :(得分:3)

他们俩都工作"对我来说,但是你使用了错误的测试类型。 >内的[[正在进行文本比较。对于算术比较,可以使用旧的-gt或(更好)正确的括号 - 双括号:

if (( nb_dd > 0 )); then
    INPUT_TYPE="txt"
fi

请注意,未使用$,因为只能在((...))内部比较数字(使用$内部可能有效,但由于扩展顺序可能会产生奇怪的副作用)

答案 1 :(得分:2)

您必须gtlt进行比较,

if [[ $nb_dd -gt 0 ]];
   then INPUT_TYPE="txt";
fi

if [ $nb_dd -gt 0 ];
   then INPUT_TYPE="txt";
fi

双括号只是扩展后缀功能

>在符合posix的test表达式中没有任何意义,它只是调用输出重定向。

[ 2 > 3 ]   && echo "shouldn't print this"

[ 2 -gt 3 ] && echo "this isn't printed"

对于posix的扩展表达式,它意味着刺激比较。

[[ "aa" > "ab" ]] && echo "doesn't print"
[[ "aa" > "aa" ]] && echo "doesn't print"
[[ "ab" > "aa" ]] && echo "prints"