在终端中运行脚本运行正常,但在创建 .sh 文件后运行会抛出错误

在终端中运行脚本运行正常,但在创建 .sh 文件后运行会抛出错误
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.

相关内容