![在终端中运行脚本运行正常,但在创建 .sh 文件后运行会抛出错误](https://linux22.com/image/1155764/%E5%9C%A8%E7%BB%88%E7%AB%AF%E4%B8%AD%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%E8%BF%90%E8%A1%8C%E6%AD%A3%E5%B8%B8%EF%BC%8C%E4%BD%86%E5%9C%A8%E5%88%9B%E5%BB%BA%20.sh%20%E6%96%87%E4%BB%B6%E5%90%8E%E8%BF%90%E8%A1%8C%E4%BC%9A%E6%8A%9B%E5%87%BA%E9%94%99%E8%AF%AF.png)
for file in Cadence*
do
mv -i "${file}" "${file/John/Krishna}"
done
我可以在终端上运行脚本复制和粘贴,它运行正常,但是在创建.sh 文件并执行后会引发语法错误等错误。
./bulkCopyFiles.sh > fedora.txt
./bulkCopyFiles.sh: line 2: syntax error near unexpected token `$'do\r''
'/bulkCopyFiles.sh: line 2: `do
答案1
有 2 个问题。
1 行尾
syntax error near unexpected token `$'do\r''
看起来您使用了 Microsoft 样式的行尾(\r\n
或 CR-LF),而不是 Unix 样式(\n
或仅 LF)。大多数 shell 解释器都不喜欢这些。
您可以使用以下方式转换行尾dos2unix
:
dos2unix bulkCopyFiles.sh
2 口译员选择/Shebang
你需要放一个舍邦在你的开始猛击脚本来表明它应该被解释为猛击。
#!/bin/bash
for file in Cadence*
do
mv -i "${file}" "${file/John/Krishna}"
done
否则 Linux 将默认使用/bin/sh
解释器不是Bash在 Ubuntu 中,但其他一些具有较小语言功能集的 Bourne 类解释器(在 Ubuntu 中短跑)。在这种情况下,Dash 不熟悉 Bash 的模式替换参数扩展。
附录:Shellcheck
使用壳牌检测(也可在同名包中找到shellcheck
)来验证您的 shell 脚本的语法。它建议您:
Line 1:
for file in Cadence*
^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang.