bash cmd 行中的脚本变量内容被 mplayer 解释为文件名

bash script variable content in cmd line interpreted as filename by mplayer

我有一个通过 mplayer 播放电影的脚本,我试图为此添加 3D 到 2D 的自动转换。这是脚本中出现的相关 cmd 行

mplayer -fs "${g[$i]}" -ss $f "${d%.*}".* -hardframedrop -nocorrect-pts -identify &>> log.txt  

即使“${g[$i]}”具有所需的选项,这也不会呈现为 2D

echo "${g[$i]}"
 -vo gl:stereo=3   

但是如果我修改cmd 行直接显示选项,电影显示为2D

mplayer -fs -vo gl:stereo=3 -ss $f "${d%.*}".* -hardframedrop -nocorrect-pts -identify &>> log.txt  

问题似乎是 mplayer 在通过 ${g[$i]} 传送时将选项解释为文件名,因此来自 log.txt

Playing  -vo gl:stereo=3 .
File not found: ' -vo gl:stereo=3 '
Failed to open  -vo gl:stereo=3 .  

我怎样才能避免这种情况?

您传递的 " -vo gl:stereo=3 " 确实无效。您应该传递 "-vo",然后传递 "gl:stereo=3"。换句话说,它应该作为两个单独的参数传递,没有前导和尾随空格。

最简单的解决方法是跳过 ${g[$i]}:

周围的引号
mplayer -fs ${g[$i]} -ss $f "${d%.*}".* -hardframedrop -nocorrect-pts -identify &>> log.txt  

更可靠的解决方法是将参数单独存储在一个数组中,例如opts=("-vo" "gl:stereo=3") 并使用 "${opt[@]}",但 Bash 不支持多维数组,因此这可能需要对您的脚本进行一些更深入的更改。