Ran*_*awa 5 linux bash ubuntu boolean-logic centos
在我运行我输入的脚本之前
# export CPIC_MAX_CONV=500
Run Code Online (Sandbox Code Playgroud)
以下是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
Run Code Online (Sandbox Code Playgroud)
输出是:
# test1.script ---- Me running the file
Empty String <<
500
CPIC_MAX_CONV="500"
Run Code Online (Sandbox Code Playgroud)
无论我使用什么""或""或[或[结果是相同的.该CPIC_MAX_CONV
变量由上述脚本找到.
我在Linux/CentOS 6.3上运行它.
这个想法很简单:找到是否CPIC_MAX_CONV
在环境中定义并返回它的值.如果有空的空间,那么当然系统中不存在变量.
为什么你总是说实话?让我们先在终端上玩一下:
\n\n$ [[ hello ]] && echo "True"\n
Run Code Online (Sandbox Code Playgroud)\n\n你认为输出是什么?(尝试一下!)下面的内容呢?
\n\n$ [[ "" ]] && echo "True"\n
Run Code Online (Sandbox Code Playgroud)\n\n(尝试一下!)。
\n\n好吧,看来非空字符串相当于 true 表达式,空字符串(或未设置的变量)相当于 false 表达式。
\n\n您所做的如下:
\n\n[[ $var=="" ]]\n
Run Code Online (Sandbox Code Playgroud)\n\n和
\n\n[[ $var!="" ]]\n
Run Code Online (Sandbox Code Playgroud)\n\n所以你给出了一个非空字符串,这是真的!
\n\n为了执行测试,您实际上需要在标记之间留有空格:
\n\n[[ $var == "" ]]\n
Run Code Online (Sandbox Code Playgroud)\n\n反而。现在,您的测试最好写为:
\n\nif [[ -z "$var" ]]; then\n echo "Empty String <<"\nelse\n echo "$CPIC_MAX_CONV"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n\n(没有子 shell,并且只有一项测试)。
\n\n关于您的脚本风格还有更多要说的。无意冒犯,我想说这真的很糟糕:
\n\n不要使用反引号!请改用该$(...)
构造。因此:
var="$(export | grep -i "CPIC_MAX_CONV" | awk \'/CPIC_MAX_CONV/ { print $NF } \')"\n
Run Code Online (Sandbox Code Playgroud)不要用来function blah
定义函数。您的函数应该定义为:
cpic () {\n local var="$(export | grep -i "CPIC_MAX_CONV" | awk \'/CPIC_MAX_CONV/ { print $NF } \')"\n if [[ -z "$var" ]]; then\n echo "Empty String <<"\n else\n echo "$CPIC_MAX_CONV"\n fi\n}\n
Run Code Online (Sandbox Code Playgroud)哦,我使用了local
关键字,因为我猜你不会var
在函数之外使用变量cpic
。
现在,该函数的目的是什么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"\n
Run Code Online (Sandbox Code Playgroud)好吧,我不想描述你的行到底在做什么,但我猜你的目的是知道变量是否已CPIC_MAX_CONV
设置并标记为导出,对吧?在这种情况下,你最好这样做:
cpic () {\n if declare -x | grep -q \'^declare -x CPIC_MAX_CONV=\'; then\n echo "Empty String <<"\n else\n echo "$CPIC_MAX_CONV"\n fi\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n它将更加高效、更加稳健。
\n\n哦,我现在正在读你文章的结尾。如果您只想判断变量是否CPIC_MAX_CONV
已设置(某些非空值 \xe2\x80\x94 ,似乎您不关心它是否被标记为导出,如果我错了,请纠正我) ),它甚至更简单(而且效率会高得多):
cpic () {\n if [[ "$CPIC_MAX_CONV" ]]; then\n echo "Empty String <<"\n else\n echo "$CPIC_MAX_CONV"\n fi\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n也会做的!
\n