以下脚本将创建一个名为“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
答案 0 :(得分:3)
[
只是test
命令的(愚蠢)别名;跟随它的一切(包括强制关闭]
)都是一个论点。 (您拥有的内容与if test "$str2">"$str3"
的处理方式相同。)
有两个问题:
操作数和运算符需要用空格分隔。
# still not quite right, but ...
if [ "$str2" > "$str3" ]
由于>
和<
被shell解释为重定向运算符,因此必须对它们进行转义,以便将它们作为参数传递给[
。
if [ "$str2 \> "$str3" ]
(您可能认为只是转义运算符就足够了;但是,"$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;”表示给命令输入。