我有一个逐行读取文件的脚本 代码是
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
答案 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
。如果您希望从不在路径中的目录运行脚本,则有三种选择:
$PATH
以包含脚本所在的目录。答案 2 :(得分:0)
我想回答你问题的这一部分:
为什么我们不能简单地通过在bash中执行此操作来执行脚本
chmod +x filename.sh filename.sh
正如其他人已经部分指出的那样,有几件事需要它起作用:
chmod
命令)shebang,因此系统知道要使用的shell /解释器
#!/bin/bash
(重要的是要说 bash ,如果你想要 bash 而不是 sh )
确保找到命令。在PATH
中找到其目录时就是这种情况。但是,在这种情况下,您宁愿做的是指定目录。对于当前目录,您可以这样做
./name-of-the-script
与DOS和(IIRC)各种Windows命令行界面相比,Unix系统通常没有PATH
上的当前目录。可以添加它,但由于对安全性的严重影响而不鼓励。