linux – Bash Script为两个但是相反的字符串测试返回true
在我运行我输入的脚本之前
# 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 } ')" >不要使用函数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 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 } 也会这样做! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 无法使用rvm安装nokogiri,收到“nokogiri需要Ruby版本>
- linux – 如何确定已安装的服务器内存是已注册(缓冲)还是未
- linux – Ansible:在不同用户的同一主机上运行不同的播放
- linux – Isilon群集上的间歇性NFS锁定
- ZFS ARC缓存和Linux缓冲区缓存争用(Ubuntu 16.04)
- linux文件操作篇 (二) 打开和关闭文件
- linux – StartSSL证书不适用于Dovecot / OpenSMTPD
- linux – 如何将git repo上传到gerrit?
- Linux服务器和CPU /电源限制的最佳实践?
- linux – Debian 6.0 AD集成