#!/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怎么会出现问题 - 命令未找到 - 但仍然可以打印出答案?
答案 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”];
因为在某些系统中,它不接受运算符'=='