我遇到麻烦,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
正常运作
答案 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风格的行结尾。