-1

我有一个脚本可以逐行读取文件代码是

FILE=commands.txt
while read CMD; do
    echo "$CMD"
done < "$FILE"

此代码存储在脚本文件 vxm_alarm.sh 在 Korn shell 中,当我运行命令时,此循环完美运行vxm_alarm.sh。但是在bash中我收到以下错误

vxm_alarm.sh: syntax error at line 4: `done' unexpected

在 Bash 中,我正在使用 command 执行脚本sh vxm_alarm.sh。我究竟做错了什么?为什么我们不能简单地通过在 bash 中执行此操作来执行脚本

chmod +x filename.sh
filename.sh
4

3 回答 3

1

您的代码使用 GNU bash 4.1.5 在我的机器上运行

尝试在顶部添加一个shebang :

#!/bin/sh
FILE=commands.txt
while read CMD; do
    echo "$CMD"
done < "$FILE"
于 2012-04-16T10:50:01.853 回答
0

我想回答你问题的这一部分:

为什么我们不能简单地通过在 bash 中执行此操作来执行脚本

chmod +x filename.sh
filename.sh

正如其他人已经部分指出的那样,要使其发挥作用,需要做几件事:

  1. chmod执行权(你用你的命令确保了)
  2. shebang ,所以系统知道使用什么外壳/解释器

    #!/bin/bash
    

    (重要的是说bash如果你想要bash而不是sh

  3. 确保找到该命令。当它的目录位于PATH. 但是,在这种情况下,您更愿意指定目录。对于当前目录,您可以这样做

    ./name-of-the-script
    

    与 DOS 和 (IIRC) 的各种 Windows 命令行界面相比,Unix 系统通常在PATH. 可以添加它,但由于对安全性的严重影响而劝阻。

于 2012-04-17T04:54:54.287 回答
0

如果你运行sh vxm_alarm.sh,你很可能不会运行 Bash。试试sh --version- 如果你得到的不是版本字符串,那不是Bash。尝试运行bash vxm_alarm.sh

为了能够在没有路径的情况下运行脚本,它必须位于PATH变量中列出的目录之一中。例如,如果

echo "$PATH"

印刷

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

您可以filename.sh输入/usr/local/sbin, /usr/local/bin, /usr/sbin, /usr/bin, /sbinor/bin并简单地运行它filename.sh。如果您希望脚本从不在路径中的目录运行,您有三个选择:

  1. 修改$PATH以包含脚本所在的目录。
  2. 使用相对或绝对路径运行它。
  3. 创建指向相对或绝对路径的别名或函数。
于 2012-04-16T11:21:02.003 回答