在我运行我输入的脚本之前
# export CPIC_MAX_CONV=500
以下是test1.script文件
#!/bin/bash
function cpic () {
var="`export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } '`"
[[ $var=="" ]] && (echo "Empty String <<")
[[ $var!="" ]] && (echo "$CPIC_MAX_CONV")
echo "$var" ;
}
cpic
输出是:
# test1.script ---- Me running the file
Empty String <<
500
CPIC_MAX_CONV="500"
无论我使用什么“”或“”或[或[结果是相同的.上述脚本可以找到CPIC_MAX_CONV变量.
我在Linux / CentOS 6.3上运行它.
这个想法很简单:找出CPIC_MAX_CONV是否在环境中定义并返回它的值.如果有空的空间,那么当然系统中不存在变量.
$[[ hello ]] && echo "True"
您认为输出是什么? (试试吧!)以下是什么?
$[[ "" ]] && echo "True"
(试试吧!).
好吧,所以似乎非空字符串等同于真实表达式,空字符串(或未设置变量)等同于false表达式.
你做了以下几点:
[[ $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 } ')"
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
}
也会这样做!