当我用sh运行它时,为什么我的bash代码会失败?

前端之家收集整理的这篇文章主要介绍了当我用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).
>使用./myscript.sh或/path/to/myscript.sh运行此脚本(以及所有其他脚本!),不带前导sh或bash.

这是一个例子:

$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中所述:

If bash is invoked with the name sh,it tries to mimic the startup behavior of historical versions of sh as closely as possible,while conforming to the POSIX standard as well.

sh myscript.sh的含义

shebang仅在运行./myscript.sh,/path/to/myscript.sh时使用,或者当您删除扩展名时,将脚本放在$PATH的目录中,然后运行myscript.

如果您明确指定了解释器,那么将使用该解释器.无论shebang说什么,sh myscript.sh都会强迫它与sh一起运行.这就是为什么改变shebang本身是不够的.

您应该始终使用其首选解释器运行脚本,因此每当执行任何脚本时,首选./myscript.sh或类似脚本.

对脚本的其他建议更改:

>引用变量(“$i”而不是$i)被认为是一种好习惯.如果存储的文件名包含空格字符,则引用的变量将防止出现问题.
>我喜欢你使用高级parameter expansion.我建议使用“${i%.mp4} .mp3”(而不是“${i / .mp4 / .mp3}”),因为${parameter%word}只能替代最后(例如一个名为foo.mp4.backup的文件).

原文链接:https://www.f2er.com/bash/386955.html

猜你在找的Bash相关文章