2017-08-11 48 views
2

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

#!/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 
+4

请看看:http://www.shellcheck.net/ – Cyrus

+4

您正在将命令$ str2的输出重定向到一个名为$ str3的文件。在这种情况下'''不是比较而是重定向。 – user8153

+0

@Cyrus感谢您的链接,它自动发现问题,好工具 – oNion

回答

3

[是用于test命令只是一个(傻)别名;它后面的所有内容(包括强制关闭])都是一个争论。 (你有什么一样对待if test "$str2">"$str3"。)

这里有两个问题:

  1. 操作数和运营商需要以空格隔开。

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

    if [ "$str2 \> "$str3" ] 
    

(你可能会认为只是逃避运营商就足够了;但是,"$str2"\>"$str3"将被视为一个单一的字符串参数test而不是三个独立的论据test将其解释为一个表达式test "$str2"\>"$str3"会只需检查单个参数是否为空)。

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

if [[ $str2 > $str3 ]] 
+0

@ slevy1该页面上没有任何内容与我所说的相矛盾。 ''''不需要在[[]]或'(())'内部转义,因为它们都是特殊的shell构造,不受正常的解析和评估规则的约束。事实上,该页面*明确指出''''和'<'在作为字符串比较运算符与'['使用时需要转义。 – chepner

+0

@chepner谢谢!那回答了我的问题 – oNion

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其中规定以下内容:

请注意,“>”需要在[]构造内转义。 ... 请注意,“<”需要在[]结构中转义。

的原因是,在测试情况下,即使用仅单个一对方括号如OP代码,“>”和“<”被解释为redirection operators。因此,“>”意思是将命令的输出引导至文件,而“<”意味着向命令提供输入,而不是分别意味着大于和小于。

+1

谢谢!网站也很好,书上有标注 – oNion

相关问题