Bash脚本理解

时间:2013-05-30 22:30:44

标签: bash shell

我正在试图确定下面提到的bash代码究竟是什么,特别是[-z $M ]部分。这里M是一个值为

的变量
if [ -z $M ] ; then
    can not find module directory
    exit 1

4 个答案:

答案 0 :(得分:7)

  1. man test 输入
  2. / - z 输入
  3. 你知道了:

    -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