我正在试图确定下面提到的bash代码究竟是什么,特别是[-z $M ]
部分。这里M是一个值为
if [ -z $M ] ; then
can not find module directory
exit 1
答案 0 :(得分:7)
man test
输入 -z STRING
the length of STRING is zero
所以你的脚本会这样做,如果$M
长度== 0,那么退出状态代码1
答案 1 :(得分:3)
正如其他人所说,它使用test
命令(又名[
)来检查字符串是否为空。至少,这是它正在努力做的事情;因为字符串($M
)不是双引号,它实际上做了一些略有不同的事情。如果没有双引号,$M
的值在被替换后会经历单词拆分和通配符扩展,因此它可能不被视为一个简单的字符串(-z
运算符可以处理)...意外后果。让我来看看一些可能性:
$M
的值是没有通配符(*
和?
)的单个字(非空白),则一切都按预期工作。如果$M
的值为零长度(空白),则测试命令只能看到一个参数(-z
);当测试只给出一个参数时,它只是测试它是否为空 - 它不是,所以它的计算结果为真。
这恰好是这种情况下的预期结果,但纯粹是巧合,而且对于许多其他运营商来说,这不是正确的结果。例如,[ -n $M ]
(看起来它应该测试$M
是否为*非*空白),[ -e $M ]
(看起来它应该测试$M
是否为如果$M
为空,则文件/目录)等都将评估为真。
$M
的值完全由空格组成(但不是空的),则会在test
看到它之前消除它,test
的计算结果为真(参见上一个案例) 。这可能是也可能不是脚本编写者想到的。如果$M
的值有多个单词,test
会尝试将其评估为表达式的一部分。它可能不是一个有效的表达式,在这种情况下test
将打印错误并返回false(这是正确的......)。
另一方面,如果它是一个有效的表达式...假设你有,M='= -z
; test
将评估表达式-z = -z
,这将是真实的,而不是脚本编写者想到的。
如果$M
的值有任何通配符,shell会尝试将它们与文件匹配,并传递test
匹配列表;它会尝试将它们作为一个表达式进行评估(参见上一个案例),可能会给出错误并返回false(再次,正确)。
请注意,如果您碰巧设置了nullglob shell选项并且通配符与任何文件都不匹配,那么shell将使用null替换它,并且脚本将表现为“u * n * m * a * t * c * h * e * d“是空字符串。
这里的教训:如果您不希望脚本以奇怪和意想不到的方式运行,请双引号变量引用!
答案 2 :(得分:1)
[
实际上是一个标准的Unix命令(可能在Bash内部实现,但可以使用你正在使用的任何shell)。它是命令test
的别名,因此可以通过键入man test
找到其手动输入。这是an online copy of that manual page。
以[
方式调用时,test
通常会将其最后一个参数设为]
,只是为了看起来很好,所以[ -z $M ]
相当于test -z $M
}。
在这种情况下,如果以下参数是长度为零的字符串,则-z
参数会导致test
返回true。因此,可以测试在脚本中进一步定义的变量$M
的有效值。
答案 3 :(得分:0)
它检查变量M
的内容是否为空字符串。
选中此link