我刚开始bash shell编程。 我已经在我的Windows 7电脑上安装了Cygwin。 我开始使用本教程编写脚本。 我的脚本需要一个parameter passing给它,如果它不应该显示一个错误消息。 这是直接来自教程的代码和我的代码中的代码:
[ $# -eq 0 ] && { echo "usage: someArgument"; exit 1; }
当我做到以下几点:
sh ./myscript.sh
它给了我这个错误:
-bash: /home/Me/myscript.sh: line 5: syntax error: unexpected end of file
“意外的文件结束”意味着我错过了某个地方的某个地方或某个地方。
我仔细检查了我的代码,但什么都没发现。 另外,当我注释掉脚本时,脚本工作得很好。
我试着用if...then...fi
:
if [ $# -eq 0 ] then echo "usage: someArgument" exit 1; fi
但无济于事!
请帮忙,这一直在困扰着我。
脚本中可能有\r
或其他一些不可见的符号。 请在脚本的开始处添加set -x
以切换调试并再次运行脚本。
抱歉,添麻烦了。 我对伊戈尔提到的不可见符号做了一些研究。 你必须在Cygwin中运行dos2unix
,它为我解决了这个问题。 DOS类型的文件有\r\n
而不是\n
和其他一些使Cygwin困惑的东西。
这个:
$ dos2unix ./myscript.sh $ sh ./myscript.sh
工作正常。
作为替代,您可以使用bash
参数扩展来测试未设置的变量。 没有位置参数, $1
将被取消设置:
: ${1?"usage: someArgument"}
:
命令是一个空操作,用作扩展其参数的钩子,即$1
。 如果$1
未设置, 将经历一些扩展并被打印到标准错误,之后非交互式外壳将退出。
(这不是解决DOS行结束问题的办法,而只是强制设置变量的另一种方法。)