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.