在bash和korn中执行脚本的区别

时间:2012-04-16 10:36:25

标签: bash unix while-loop

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

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中,我使用命令sh vxm_alarm.sh执行脚本。我究竟做错了什么?为什么我们不能简单地通过在bash中执行此操作来执行脚本

chmod +x filename.sh
filename.sh

3 个答案:

答案 0 :(得分:1)

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

尝试在顶部添加shebang

#!/bin/sh
FILE=commands.txt
while read CMD; do
    echo "$CMD"
done < "$FILE"

答案 1 :(得分: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/sbin/bin并运行简单地filename.sh。如果您希望从不在路径中的目录运行脚本,则有三种选择:

  1. 修改$PATH以包含脚本所在的目录。
  2. 使用相对或绝对路径运行它。
  3. 创建指向相对路径或绝对路径的别名或函数。

答案 2 :(得分:0)

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

  

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

chmod +x filename.sh
filename.sh

正如其他人已经部分指出的那样,有几件事需要它起作用:

  1. 执行权利(您确保使用chmod命令)
  2. shebang,因此系统知道要使用的shell /解释器

    #!/bin/bash
    

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

  3. 确保找到命令。在PATH中找到其目录时就是这种情况。但是,在这种情况下,您宁愿做的是指定目录。对于当前目录,您可以这样做

    ./name-of-the-script
    

    与DOS和(IIRC)各种Windows命令行界面相比,Unix系统通常没有PATH上的当前目录。可以添加它,但由于对安全性的严重影响而不鼓励。