首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cygwin bash语法错误-但脚本在Ubuntu中运行良好

Cygwin bash语法错误-但脚本在Ubuntu中运行良好
EN

Stack Overflow用户
提问于 2010-03-26 06:51:35
回答 4查看 4.9K关注 0票数 5
代码语言:javascript
复制
#!/bin/bash
if test "$#" == "4"; then echo "$*"; else echo "args-error" >&2; fi;

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

Ubuntu运行bash版本4.0+,而Cygwin运行3.2.49;但我认为版本冲突不应该是导致这个问题的原因,这段代码在同样使用bash版本3.+的Fedora10下运行得很好

所以基本上我想知道是否有一种方法可以一次性地编写我的脚本,这样以后就不会有这个可怕的问题了。

在此之前,非常感谢您。

编辑:目前我还没有手写的Cygwin,但在我的记忆中,它一直在说像无法解析未定义的令牌"fi“之类的东西。

编辑:原来的表单是这样的,是从服务器上找到的:

代码语言:javascript
复制
#!/bin/bash
if ["$#" == "4"];
    then echo "$*";
    else echo "args-error" >&2;
fi;

控制台抱怨:

代码语言:javascript
复制
$ ./test.sh 1 2 3
./test.sh: line 2: [3: command not found
args-error

我也想知道为什么stderr说有些地方出错了-没有找到命令-但仍然可以打印出答案?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-26 07:10:38

您需要在[]周围留出空格。

代码语言:javascript
复制
#!/bin/bash
if [ "$#" == "4" ];
    then echo "$*";
    else echo "args-error" >&2;
fi;
票数 7
EN

Stack Overflow用户

发布于 2010-03-26 06:55:54

更新答案:

[后面需要一个空格,否则["$#"的计算结果为[3,这是不存在的。试试这个:

代码语言:javascript
复制
if [ "$#" == "4" ];
    then echo "$*";
    else echo "args-error" >&2;
fi;

这对我很管用。我猜你会得到一个类似这样的错误:

代码语言:javascript
复制
test.sh: line 2: $'\r': command not found
test.sh: line 3: $'\r': command not found

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

代码语言:javascript
复制
dos2unix test.sh

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

票数 4
EN

Stack Overflow用户

发布于 2010-03-26 07:14:03

在显示“原始表单”的编辑中,问题似乎是在["之间缺少一个空格

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2520008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档