bash条件测试之空字符串的困惑

看一个字符串是否为空,可以通过 -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强调尽量用“[[ ... ]]”结构还是很有道理的。

时间: 2024-08-03 06:22:43

bash条件测试之空字符串的困惑的相关文章

Javascript 中的【false】,【零值】,【null】,【undefined】和【空字符串】

在Javascript中,我们经常会接触到题目中提到的这5个比较特别的对象--false.0.空字符串.null和undefined.这几个对象很容易用错,因此在使用时必须得小心. 类型检测 我们下来看看他们的类型分别是什么: <script type="text/javascript">     alert(typeof(false) === 'boolean');     alert(typeof(0) === 'number');     alert(typeof(&

去除数组里面值为空或者为空字符串的元素

array_filter(array('a'=>'','',null,'b'=>3),function($val){         if($val===''||$val===null){               return false;        }else{               return true;       } }); 此方法可以将数组的元素键值为空或者为空字符串的元素去除,当然你可以加其他的去除条件来去除数组里面你不想要的值.以前我都是用foreach来循环判断

sql server 之函数小技巧 &amp;&amp; 整数类型为空是用空字符串替代实现

1.判空函数 说明:使用指定的替换值替换 NULL. 语法:ISNULL ( check_expression , replacement_value ) 参数: check_expression:将被检查是否为 NULL 的表达式.check_expression 可以为任何类型. replacement_value:当 check_expression 为 NULL 时要返回的表达式.replacement_value 必须是可以隐式转换为 check_expresssion 类型的类型.

Javascript 中的false、0、null、undefined和空字符串对象

在Javascript中,我们经常会接触到题目中提到的这5个比较特别的对象——false.0.空字符串.null和undefined.这几个对象很容易用错,因此在使用时必须得小心. 类型检测 我们下来看看他们的类型分别是什么: [html] view plaincopyprint? <script type="text/javascript"> alert(typeof(false) === 'boolean'); alert(typeof(0) === 'number')

Oracle中Null与空字符串&#39; &#39;的区别

含义解释: 问:什么是NULL? 答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零. ORACLE允许任何一种数据类型的字段为空,除了以下两种情况: 1.主键字段(primary key), 2.定义时已经加了NOT NULL限制条件的字段 说明: 1.等价于没有任何值.是未知数. 2.NULL与0.空字符串.空格都不同. 3.对空值做加.减.乘.除等运算操作,结果仍为空. 4.NULL的处理使用NVL函数. 5.比较时使用关键

Access空字符串和Null值

什么是空字符串和Null值: Microsoft Access可以区分两种类型的空值.因为在某些情况下,字段为空,可能是因为信息目前无法获得,或者字段不适用于某一特定的记录.例如,表中有一个“电话号码”字段,将其保留为空白,可能是因为不知道顾客的电话号码,或者该顾客没有电话号码.在这种情况下,使字段保留为空或输入Null值,意味着“不知道”.双引号内为空字符串则意味着“知道没有值”.采用字段的“必填字段”和“允许空字符串”属性的不同设置组合,可以控制空白字段的处理.“允许空字符串”属性只能用于“

Javascript 中的false,零值,null,undefined和空字符串对象

在Javascript中,我们经常会接触到题目中提到的这5个比较特别的对象--false.0.空字符串.null和undefined.这几个对象很容易用错,因此在使用时必须得小心. 类型检测 我们下来看看他们的类型分别是什么: <script type="text/javascript"> alert(typeof(false) === 'boolean'); alert(typeof(0) === 'number'); alert(typeof("")

解决CsvWriter:中文乱码、末尾行多一行空格(/r)、非第一列空字符串&quot;&quot;显示null问题

一:主要内容 解决CsvWriter存csv,csv文件打开后中文乱码问题 解决CsvWriter存csv,csv文件最后一行总是多一行空行的问题 解决CsvWriter存csv,csv文件不是第一列的时候,想存入""即空字符串无法存入显示null的问题 二:解决问题前:需要做的事情 因为网上的CsvWrite的jar包导入到我们的工程中是class文件,针对上面的问题是无法修改源码的,但是我们又想用这个工具来操作csv,所以可以在自己的工程中首先pom引用这个jar包 <dep

Mybatis中,Integer类型参数值为0时得到 &quot;&quot;(空字符串)

今日遇到的问题: 查询版本信息时,由于version是Integer类型,所以当前台选择版本为0时,变成了查询了所有的版本信息. sql片段: </if> <if test="version != null and version != '' ">     AND a.version = #{version} </if> 原因: MyBatis因自身原因默认了 Integer类型数据值等于0时 为 ""(空字符串) 解决办法: 1