我有一个无法检测零长度字符串的脚本,该脚本[ -n $value ]
在 bash 条件表达式中使用,即
#!/usr/bin/env bash
value=""
if [ -n $value ]
then
echo "value is non-zero"
fi
Run Code Online (Sandbox Code Playgroud)
结果
值不为零
如果我使用[[ -n $value ]]
它有效,即
#!/usr/bin/env bash
value=""
if [[ -n $value ]]
then
echo "value is non-zero"
fi
Run Code Online (Sandbox Code Playgroud)
using[[
不会产生预期的输出。从手册页:
Run Code Online (Sandbox Code Playgroud)[[ expression ]] Return a status of 0 or 1 depending on the evaluation of the conditional expression expression. Expressions are composed of the pri? maries described below under CONDITIONAL EXPRESSIONS. Word splitting and pathname expansion are not performed on the words between the [[ and ]]; tilde expansion, parameter and variable expansion, arithmetic expansion, command substitution, process substitution, and quote removal are performed. Conditional operators such as -f must be unquoted to be recognized as primaries.
我无法对此行为做出解释。
为什么[[
检测零长度字符串但[
没有?
mik*_*erv 17
这是因为[[
需要一个表达,并[
采用参数,它转换成一个表达。
[[
是语法-它不是一个内置命令为[
是,而是[[
是一个复合命令和更类似于{
或(
比它要[
。
在任何情况下,因为[[
是与 一起 解析的$expansions
,所以很容易理解空值扩展和缺失操作数之间的区别。
[
,但是,是在所有命令行扩展已经发生之后运行的例行程序,并且在它评估其表达式时,$null_expansion
已经扩展为空,因此它接收到的只是[ -n ]
,这可能不是一个有效的表达式。[
对于非空的单参数情况,规范会返回 true - 就像-n
这里一样 - 但同样的规范继续说......
两个命令:
Run Code Online (Sandbox Code Playgroud)test "$1" test ! "$1"
无法在某些历史系统上可靠地使用。如果使用和这样的字符串表达会发生意外的结果
$1
扩展到!
,(
或公知的一元伯(如-n
)。更好的构造是:Run Code Online (Sandbox Code Playgroud)test -n "$1" test -z "$1"
两种形式都有优点和缺点。[
表达式可以由扩展构成,因此:
[ "-${z:-n}" "$var" ]
Run Code Online (Sandbox Code Playgroud)
...可能是构建测试的一种完全有效的方法,但不适用于:
[[ "-${z:-n}" "$var" ]]
Run Code Online (Sandbox Code Playgroud)
...这是一个无意义的命令。差异完全是由于运行测试的命令行解析点造成的。
变量不必用双引号括起来,[[ ]]
但应该用[ ]
.
如果没有引号,if$value
是空字符串,[ -n $value ]
与[ "-n" ]
. "-n"
是一个字符串测试,评估为非空,因此为真,因此测试成功。
(为什么?因为-n STRING
和又名STRING
相同- 它们都是字符串非空的测试)[
test
进一步的实验表明,这似乎适用于所有单操作数测试,包括文件运算符 - 如果没有操作数,[ ]
则将单个参数视为字符串测试。如果这不是脚本编写者几十年来所依赖的历史事实,这可能会被视为一个错误并已修复 - 更改它会破坏无数现有脚本。
带引号,[ -n "$value" ]
与 完全相同[ -n "" ]
,因此测试失败。
[[ ... ]]
对引用变量更加宽容 - 引用是可选的,无论有没有引号,它的工作原理都是一样的。
归档时间: |
|
查看次数: |
1749 次 |
最近记录: |