Cygwin bash语法错误 - 但脚本在Ubuntu中运行得非常好

时间:2010-03-25 22:51:35

标签: bash shell cygwin

#!/bin/bash
if test "$#" == "4"; then echo "$*"; else echo "args-error" >&2; fi;

当我尝试在Ubuntu和Cygwin上运行它时,这个小代码片段给我带来了很多麻烦。

Ubuntu运行bash版本4.0+而Cygwin运行3.2.49;但我认为版本冲突不应该是这个原因,这个代码在fedora 10下运行良好,Fedora 10也使用bash版本3。+

所以基本上我想知道是否有办法一次性编写我的脚本代码,以便以后不会出现这个可怕的问题。

非常感谢提前。

编辑:我现在没有手工制作Cygwin,但是从我的记忆中,它一直在说像无法解决未定义的令牌“fi”之类的东西。

编辑:好吧,原始表单是这样的,只是从服务器找到:

#!/bin/bash
if ["$#" == "4"];
    then echo "$*";
    else echo "args-error" >&2;
fi;

控制台抱怨:

$ ./test.sh 1 2 3
./test.sh: line 2: [3: command not found
args-error

我也想知道stderr怎么会出现问题 - 命令未找到 - 但仍然可以打印出答案?

4 个答案:

答案 0 :(得分:7)

您需要[]周围的空白区域。

#!/bin/bash
if [ "$#" == "4" ];
    then echo "$*";
    else echo "args-error" >&2;
fi;

答案 1 :(得分:4)

更新回答:

[之后需要一个空格,否则["$#"被评估为例如[3不存在的空格。试试这个:

if [ "$#" == "4" ];
    then echo "$*";
    else echo "args-error" >&2;
fi;

它对我有用。我猜你会收到这样的错误:

test.sh: line 2: $'\r': command not found
test.sh: line 3: $'\r': command not found

这可能是因为您使用Windows样式的行结尾编辑了文件,但Bash期望Unix样式的行结尾。要修复该文件,请尝试运行以下命令:

dos2unix test.sh

您当然需要将文件名更改为脚本的实际文件名。

答案 2 :(得分:2)

在您的编辑中显示“原始表单”时,问题似乎是您错过了["

之间的空格

答案 3 :(得分:1)

尝试使用运算符'='而不是'=='。并在[之后添加一个空格,在]之前添加另一个空格,如下所示

  
    

if [“$#”=“4”];
       然后回声“$ *”;
       否则回应“args-error”>& 2;
    网络连接;

  

甚至可以尝试'-eq'代替'=='

  
    

if [“$#” - eq“4”];

  

因为在某些系统中,它不接受运算符'=='