当我用sh运行它时,为什么我的bash代码会失败?
我有一行代码可以在我的终端中正常工作:
for i in *.mp4; do echo ffmpeg -i "$i" "${i/.mp4/.mp3}"; done 然后我在脚本myscript.sh中放入完全相同的代码行: #!/bin/sh for i in *.mp4; do echo ffmpeg -i "$i" "${i/.mp4/.mp3}"; done 但是,现在运行它时出现错误: $sh myscript.sh myscript.sh: 2: myscript.sh: Bad substitution 基于其他问题,我尝试将shebang更改为#!/ bin / bash,但我得到了完全相同的错误.为什么我不能运行这个脚本?
TL; DR:由于您使用的是bash特定功能,因此您的脚本必须使用bash而不是sh:
$sh myscript.sh myscript.sh: 2: myscript.sh: Bad substitution $bash myscript.sh ffmpeg -i bar.mp4 bar.mp3 ffmpeg -i foo.mp4 foo.mp3 bash基本上是对C来说是什么C.见Difference between sh and bash. 确保bash特定脚本始终正确运行的最佳方法 最佳做法是: >将#!/ bin / sh替换为#!/ bin / bash(或者脚本所依赖的其他shell). 这是一个例子: $cat myscript.sh #!/bin/bash for i in *.mp4 do echo ffmpeg -i "$i" "${i/.mp4/.mp3}" done $chmod +x myscript.sh # Ensure script is executable $./myscript.sh ffmpeg -i bar.mp4 bar.mp3 ffmpeg -i foo.mp4 foo.mp3 (相关:Why ./ in front of scripts?) #!/ bin / sh的含义 shebang建议系统应该使用哪个shell来运行脚本.这允许您指定#!/usr/bin/python或#!/ bin / bash,这样您就不必记住哪种脚本是用哪种语言编写的. 当人们仅使用一组有限的功能(由POSIX标准定义)时,人们使用#!/ bin / sh以获得最大的可移植性.对于利用有用的bash扩展的用户脚本,#!/ bin / bash非常好. / bin / sh通常符号链接到最小的POSIX兼容shell或标准shell(例如bash).即使在后一种情况下,#!/ bin / sh也可能失败,因为bash将在兼容模式下运行,如manpage中所述:
sh myscript.sh的含义 shebang仅在运行./myscript.sh,/path/to/myscript.sh时使用,或者当您删除扩展名时,将脚本放在$PATH的目录中,然后运行myscript. 如果您明确指定了解释器,那么将使用该解释器.无论shebang说什么,sh myscript.sh都会强迫它与sh一起运行.这就是为什么改变shebang本身是不够的. 您应该始终使用其首选解释器运行脚本,因此每当执行任何脚本时,首选./myscript.sh或类似脚本. 对脚本的其他建议更改: >引用变量(“$i”而不是$i)被认为是一种好习惯.如果存储的文件名包含空格字符,则引用的变量将防止出现问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |