【问题标题】:Cygwin bash syntax error - but script run perfectly well in UbuntuCygwin bash 语法错误 - 但脚本在 Ubuntu 中运行良好
【发布时间】:2010-03-25 22:51:35
【问题描述】:
#!/bin/bash
if test "$#" == "4"; then echo "$*"; else echo "args-error" >&2; fi;

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

Ubuntu 运行 bash 版本 4.0+,而 Cygwin 运行 3.2.49;但我认为版本冲突不是造成这种情况的原因,这段代码在使用 bash 版本 3 的 fedora 10 下运行良好。+

所以基本上我想知道是否有办法一劳永逸地编写我的脚本,这样以后就不会出现这个可怕的问题了。

非常感谢。

已编辑:我目前手头没有 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 说出了点问题-找不到命令-但仍然可以打印出答案?

【问题讨论】:

  • 您遇到的错误是什么?这段代码 sn-p 对我来说似乎工作得很好(Ubuntu 9.10,bash 4.0.33)。
  • 在我的 Cygwin 上看起来不错(也是 bash 3.2.49)。错误信息是什么?
  • @mobrule : 对不起,这是使用测试语句的固定版本,我已经更新了问题,现在有错误...

标签: bash shell cygwin


【解决方案1】:

[] 周围需要空格。

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

【讨论】:

  • @mobrule:谢谢!啊哈,没想到这样的事情会导致错误......习惯Java语法......
  • 这是因为 [ 实际上是旧 Unix 中曾经是一个单独程序的别名,称为 test。您可以将上面的内容写为“if test”$#” == “4”]... 现在应该明白为什么需要空格了。
  • @WarrenYoung,一个更正——旧式 unix test(实际上是 POSIX 标准)不允许 == 作为运算符;它需要是= 用于字符串比较或-eq 用于数字比较。
  • @CharlesDuffy:您的评论放错了地方。 OP 用== 提出问题,所有答案都使用== 以减少混淆。您应该对上面的问题发表评论。
  • @WarrenYoung,我在这里发表评论,因为您专门谈到了与传统 test 命令的兼容性。
【解决方案2】:

更新答案:

[ 之后需要一个空格,否则 ["$#" 会被评估为不存在的 [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

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

【讨论】:

  • @Mark Byers:原始版本的错误仍然相同。奇怪的是,它打印出一些标准错误,然后得到标准输出的答案。我的理解是如果出现问题,脚本执行应该被杀死......
【解决方案3】:

在您编辑以显示“原始形式”时,问题似乎是您在 [" 之间缺少一个空格

【讨论】:

    【解决方案4】:

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

    如果 [ "$#" = "4" ];
    然后回显 "$*";
    else echo "args-error" >&2;
    菲;

    或者甚至尝试使用 '-eq' 而不是 '=='

    如果 [ "$#" -eq "4" ];

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多