【问题标题】:Cygwin error when doing if...then...fi - Bash script执行 if...then...fi 时出现 Cygwin 错误 - Bash 脚本
【发布时间】:2012-07-15 06:38:35
【问题描述】:

我刚开始 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

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

我仔细检查了我的代码,但发现什么都没有。另外,当我注释掉该行时,脚本运行良好。

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

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

但无济于事!

请帮忙,它一直困扰着我。

【问题讨论】:

  • 考虑提供一个准确的脚本来重现您的问题。目前尚不清楚您的“5”行在哪里。
  • @torrentialcoding 我正在使用记事本++。当我在脚本上运行 dos2unix 时,我刚刚注意到右下角的单词从 Dos/Windows 变为 UNIX(请参阅我的答案)。
  • @Java 我相信 Notepad++ 允许您以 Unix 模式保存文件。这将为您节省一个额外的步骤,即必须运行 dos2unix 工具以使您的脚本可用。
  • @torrentialcoding 是的。您可以转到编辑>EOL 转换>UNIX 格式,或在 Preferences 下设置为默认值。这是个好消息:)

标签: linux bash shell if-statement cygwin


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    这个:

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

    工作正常。

    【讨论】:

      【解决方案3】:

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

      : ${1?"usage: someArgument"}
      

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

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

      【讨论】:

        猜你喜欢
        • 2015-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多