为什么你总是说实话?让我们先在你的终端上玩一点:
$ [[ hello ]] && echo "True"
你认为输出是什么? (试试看!)还有以下内容?
$ [[ "" ]] && echo "True"
(试试看!)。
好吧,看来非空字符串等价于真表达式,空字符串(或未设置的变量)等价于假表达式。
你做了以下事情:
[[ $var=="" ]]
和
[[ $var!="" ]]
所以你给了一个非空字符串,这是真的!
为了执行测试,你实际上需要在标记之间有空格:
[[ $var == "" ]]
相反。现在,您的测试最好写成:
if [[ -z "$var" ]]; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
(没有子外壳,只有一个测试)。
关于您的脚本风格还有很多话要说。没有冒犯,我会说这真的很糟糕:
-
不要使用反引号!请改用$(...) 构造。因此:
var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')"
-
不要使用function blah 来定义函数。你的函数应该被定义为:
cpic () {
local var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')"
if [[ -z "$var" ]]; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
}
哦,我使用了local 关键字,因为我猜你不会在函数cpic 之外使用变量var。
现在,函数cpic 的用途是什么,尤其是您定义变量var 的地方?这很难描述(因为有很多你没有想到的案例)。 (顺便说一句,你的grep 在这里似乎真的没用)。以下是您忽略的几个案例:
- 导出的变量名为
somethingfunnyCPIC_MAX_CONVsomethingevenfunnier
-
导出的变量在某处包含字符串CPIC_MAX_CONV,例如,
export a_cool_variable="I want to screw up Randhawa's script and just for that, let's write CPIC_MAX_CONV somewhere here"
好的,我不想描述你的行在做什么,但我猜你的目的是知道变量CPIC_MAX_CONV 是否已设置并标记为导出,对吗?在这种情况下,你最好这样做:
cpic () {
if declare -x | grep -q '^declare -x CPIC_MAX_CONV='; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
}
它将更高效,更健壮。
哦,我现在正在阅读您帖子的结尾。如果您只想判断变量 CPIC_MAX_CONV 是否已设置(设置为一些非空值 - 似乎您不在乎它是否标记为导出,如果我错了请纠正我),它甚至更简单(并且效率会高得多):
cpic () {
if [[ "$CPIC_MAX_CONV" ]]; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
}
也可以!