bash条件测试之空字符串的困惑
来源:互联网 发布:ppp和hdlc对数据的 编辑:程序博客网 时间:2024/05/16 17:38
看一个字符串是否为空,可以通过 -n 或 -z来判断。按照操作符的意义,变量VAR而言,如果VAR为空或未定义,那么-n测试结果应该为假,而-z应该为真。反之,如果不空,则-n为真,-z为假。
采用条件测试的列表形式,即“[ -n $VAR ] && echo TRUE”,如果输出TRUE,则表明条件测试结果为真。
经过测试,显然VAR不空时,测试结果都正常,而VAR为空,测试结果也是真,但很多手册指南什么的(包括ABS《Advance Bash Scripting Guide》的示例7.1),都说这个应该可以正常工作,原因何在?
将上面语句写入脚本,并用bash -x 执行,发现测试条件成为了“'[' -n ']'”,也就是说经过分词处理之后, 为空的变量实际上消失了,测试命令变成了只有“-n”这么一个参数,而查bash手册(bash4.2)中关于test(与'['命令等价, 注意“[”实际上是一个命令)命令求值的解释,发现只有一个参数而且参数不空的时候,求值都为真。也就是说,将 “-n”换成别的什么测试操作符,比如“-z”或“-e”,测试结果都是真。一试,果不其然。
解决办法是什么呢?
方法一,不直接使用变量${VAR},而是后面附加一个任意字符,然后比较与此字符是否相等来测试,变量是否为空。 比如“[ ${VAR}y == y ] && echo TRUE”,会输出TRUE,而“[ ${VAR}y != y ] && echo TRUE”就不会输出。
方法二,使用“if [[ conditional-expression ]] ”的形式。其中“[[”是关键字而不是命令。这种形式下“[[ ... ]]”不会 进行分词处理,所以用bash -x执行脚本,发现“[[ -n $VAR ]]”成了“[[ -n '' ]]”,就是说空串依然作为一个参数(即'')保存下来了,根据test的求值规则,这是两个参数了,所以测试操作符就能正常工作了。这样一看,ABS强调尽量用“[[ ... ]]”结构还是很有道理的。
方法三,使用双引号将$VAR引起来,当$VAR为空时也可以得到一个空字符串作为做参数,这样就不会发生将"-n"作为'['命令的参数的问题。
- bash条件测试之空字符串的困惑
- Linux学习笔记:bash的算术运算及条件测试
- 字符串数组的困惑
- 【bash】bash脚本编程之条件判断
- 软件测试管理之困惑
- bash语法之条件判断
- bash编程之 条件判断
- bash条件测试及变量比较
- 困惑:条件运算符的异常
- left join加上where条件的困惑
- mybatis if判断int类型的查询条件如何判断空和空字符串
- bash之字符串处理
- 困惑的软件测试员
- 困惑的软件测试员
- 困惑的软件测试员
- 做黑盒测试的困惑
- 开发还是测试的困惑
- PHP之0与空字符串关系测试以及详解
- Linux驱动开发(2):Hello world模块
- 黑马程序员-iOS基础-Objective-C基础(五)
- Zoho Showtime: 你的演讲听众都在看手机吗?
- 二叉树的深度优先遍历和广度优先遍历
- 关于exlipse启动时jdk版本问题
- bash条件测试之空字符串的困惑
- jsp <c:set>标签的使用
- PocketCloud Computer Era
- iOS 之GCD和Block
- 使用双栈实现输出逻辑表达式的真值表
- 用宏定义最大值
- loadrunner的ie代理问题
- INSTALL_PARSE_FAILED_NO_CERTIFICATES异常
- IOS证书/私钥/代码签名/描述文件