Bash脚本创建一个不应该的文件

时间:2017-08-11 17:35:26

标签: bash output-redirect

以下脚本将创建一个名为“Happy”的文件,我无法弄清楚原因,有人可以尝试这个脚本并告诉我发生了什么吗? 谢谢!

#!/bin/bash

str1=""
str2="Sad"
str3="Happy"

if [ "$str2">"$str3" ]
    then echo "$str2 is greater than $str3"
elif [ "$str2"<"$str3" ]
    then echo "$str2 is less than $str3"
fi

2 个答案:

答案 0 :(得分:3)

[只是test命令的(愚蠢)别名;跟随它的一切(包括强制关闭])都是一个论点。 (您拥有的内容与if test "$str2">"$str3"的处理方式相同。)

有两个问题:

  1. 操作数和运算符需要用空格分隔。

    # still not quite right, but ...
    if [ "$str2" > "$str3" ]
    
  2. 由于><被shell解释为重定向运算符,因此必须对它们进行转义,以便将它们作为参数传递给[

    if [ "$str2 \> "$str3" ]
    
  3. (您可能认为只是转义运算符就足够了;但是,"$str2"\>"$str3"将被视为test的单个字符串参数,而不是test将解释为的三个单独的参数表达式。test "$str2"\>"$str3"只会检查单个参数是否为空。)

    由于您使用的是bash,因此使用[[代替[要简单得多。 [[不是常规命令;它由bash识别的特殊语法,因此正常的处理规则不适用。这里最相关的是>是一个字符串比较运算符,而不是重定向运算符,所以它不需要转义。

        if [[ $str2 > $str3 ]]
    

答案 1 :(得分:2)

如果您按如下方式重写代码:

#!/bin/bash

    str1=""
    str2="Sad"
    str3="Happy"

    if [[ "$str2" > "$str3" ]]
        then echo "$str2 is greater than $str3"
    elif [[ "$str2" < "$str3" ]]
        then echo "$str2 is less than $str3"
    fi

然后比较应该正确进行,您可以避免无意中创建文件。额外的“[”和“]”对将代码从测试上下文中取出,允许进行比较并避免文件创建。更多信息here,其中说明了以下内容:

  

请注意“&gt;”需要在[]构造中转义。   ...   请注意“&lt;”需要在[]构造中进行转义。

原因是在测试环境中,即在OP代码中仅使用一对方括号,“&gt;”和“&lt;”被解释为redirection operators。因此,而不是分别大于和小于的意义,“&gt;”表示将命令的输出定向到文件,而“&lt;”表示给命令输入。