我刚开始使用bash shell编程。我在Windows 7计算机上安装了Cygwin。我开始使用this tutorial编写脚本。我的脚本需要传递一个参数,如果它没有显示错误消息。这是直接来自教程的代码和我的代码中的相同代码:
[ $# -eq 0 ] && { echo "usage: someArgument"; exit 1; }
当我执行以下操作时:
sh ./myscript.sh
它给了我这个错误:
-bash: /home/Me/myscript.sh: line 5: syntax error: unexpected end of file
"文件意外结束"意味着我错过了fi
或done
等等。
我仔细检查了我的代码,但发现没有。另外,当我对该行进行注释时,脚本的工作完全正常。
我尝试使用if...then...fi
:
if [ $# -eq 0 ]
then
echo "usage: someArgument"
exit 1;
fi
但无济于事!
请帮助,它一直在困扰我。
答案 0 :(得分:5)
您可能在脚本中有\r
或其他一些不可见的符号。请将set -x
添加到脚本的开头以打开调试并再次运行脚本。
答案 1 :(得分:5)
对不起,不好意思。我对伊戈尔提到的隐形符号进行了一些研究。你必须在Cygwin中运行dos2unix
,它为我解决了它。 Dos类型的文件有\r\n
而不是\n
以及其他一些让Cygwin感到困惑的东西。
此:
$ dos2unix ./myscript.sh
$ sh ./myscript.sh
正常工作。
答案 2 :(得分:1)
作为替代方法,您可以使用bash
参数扩展来测试未设置的变量。如果没有位置参数,$1
将被取消设置:
: ${1?"usage: someArgument"}
:
命令是一个空操作,用作扩展其参数的钩子,$1
。如果未设置$1
,则?
后面的单词将进行一些扩展并打印到标准错误,之后将退出非交互式shell。
(这不是解决DOS行结束问题的方法,而是另一种强制设置变量的方法。)