Cygwin无法运行一些bash命令

时间:2011-11-17 15:15:08

标签: bash

我遇到麻烦,cygwin没有按预期运行我的脚本文件

这是我的代码

#!/bin/sh
echo "Ja eller nei:"
read svar
if ["$svar" = "ja"]; then
    echo "Du er Positiv"
    exit 0
elif ["$svar" = "nei"]; then
    echo "Du er Negativ"
    exit 0
else
    echo "Du er Nøytral"
fi

这是我的输出cygwin

$ /cygdrive/c/MyScripts/Bash.sh
Ja eller nei:
ja
': not a valid identifierh.sh: line 6: read: `svar
/cygdrive/c/MyScripts/Bash.sh: line 10: syntax error near unexpected token `elif'
'cygdrive/c/MyScripts/Bash.sh: line 10: `elif ["$svar" = "nei"]; then

它的3个最后错误行我不明白。我理解错误的位置,但不知道它们在那里的原因。

BTW之所以我说有些是

for i in {1..100}; do echo $i; done

正常运作

3 个答案:

答案 0 :(得分:3)

尝试以正确的间距形成测试语句:

#!/bin/sh
echo "Ja eller nei:"
read svar
if [ "$svar" = "ja" ]; then
    echo "Du er Positiv"
    exit 0
elif [ "$svar" = "nei" ]; then
    echo "Du er Negativ"
    exit 0
else
    echo "Du er Nøytral"
fi

这是我得到的输出:

lnet@bowser ~ $:) sh test.sh
Ja eller nei:
ja
Du er Positiv
lnet@bowser ~ $:) sh test.sh
Ja eller nei:
nei
Du er Negativ
lnet@bowser ~ $:) sh test.sh
Ja eller nei:
fish
Du er N[G[Gøytral
lnet@bowser ~ $:(

更新(感谢Sorpigal):

另外,请确保您的文件具有正确的unix行结尾:

dos2unix -f /cygdrive/c/MyScripts/Bash.sh

答案 1 :(得分:0)

如果我错了,请纠正我,但是cygwin是bash。所以试试这个:

#!/bin/bash

echo "Ja eller nei:"
read svar

if [[ "$svar" == "ja" ]]; then
    echo "Du er Positiv"
    exit 0
elif [[ "$svar" == "nei" ]]; then
    echo "Du er Negativ"
    exit 0
else
    echo "Du er Nøytral"
fi

为确保您拥有合适的版本,请执行以下操作:

wget http://pastie.org/pastes/2880899/text
chmod +x text
./text

答案 2 :(得分:0)

read svar

': not a valid identifierh.sh: line 6: read: `svar

我敢打赌,实际的错误信息是:

`svar\r': not a valid identifer ...

您的脚本具有Windows样式的"\r\n"行结尾。 Cygwin的/bin/sh需要Unix风格的"\n"行结尾。 shell看到"read svar"行,而不是"read svar"后跟行尾,但是"read svar"后跟一个CR('\r')字符,后跟end-of -线。它试图将"svar\r"解释为标识符,并抱怨它无效。

编辑:我看到另一个答案已经提到了这一点。我将在这里留下我的答案,因为我建议一些方法来验证问题并避免它。

尝试运行/cygdrive/c/MyScripts/Bash.sh | cat -A以查看错误消息的真实含义。

使用dos2unix(我认为这是正确的命令名称)来修复脚本的行结尾。 (首先阅读手册页;与大多数Unixish过滤器命令不同,它替换命名文件而不是写入stdout。)

将来避免此问题的一种方法是使用Cygwin提供的文本编辑器(vim,emacs,nano,您喜欢的任何一个)编写脚本。如果你想使用Windows编辑器(记事本,Notepad ++,...),可能有一种方法可以配置它来编写Unix风格的行结尾。