4

我刚开始 bash shell 编程。我已经在我的 Windows 7 计算机上安装了 Cygwin。我开始使用本教程编写脚本。我的脚本需要一个参数传递给它,如果不是,它应该显示一条错误消息。这是直接来自教程的代码,与我的代码中的代码相同:

[ $# -eq 0 ] && { echo "usage: someArgument";  exit 1; }

当我执行以下操作时:

sh ./myscript.sh

它给了我这个错误:

-bash: /home/Me/myscript.sh: line 5: syntax error: unexpected end of file

“文件意外结束”表示我在某处错过了fiordone等​​。

我仔细检查了我的代码,但一无所获。另外,当我注释掉该行时,脚本工作得非常好。

我尝试使用if...then...fi

if [ $# -eq 0 ]
then
    echo "usage: someArgument"
    exit 1;
fi

但无济于事!

请帮助,它一直难倒我。

4

3 回答 3

5

可能您\r在脚本中有或其他一些不可见的符号。请添加set -x到脚本的开头以打开调试并再次运行脚本。

于 2012-07-15T07:58:49.463 回答
5

抱歉,添麻烦了。我对伊戈尔提到的隐形符号做了一些研究。你必须dos2unix在 Cygwin 中运行,它为我解决了这个问题。Dos 类型的文件有\r\n代替\n和其他一些让 Cygwin 感到困惑的东西。

这:

$ dos2unix ./myscript.sh
$ sh ./myscript.sh

工作正常。

于 2012-07-15T08:30:35.883 回答
1

作为替代方案,您可以使用bash参数扩展来测试未设置的变量。没有位置参数,$1将被取消设置:

: ${1?"usage: someArgument"}

:命令是一个空操作,用作扩展其参数的钩子,即$1. 如果$1未设置,则 the 后面的单词?将进行一些扩展并打印为标准错误,之后将退出非交互式 shell。

(这不是解决您的 DOS 行尾问题的方法,而只是另一种强制设置变量的方法。)

于 2012-07-15T14:07:02.227 回答