【问题标题】:Passing shell variables containing spaces as arguments将包含空格的 shell 变量作为参数传递
【发布时间】:2014-12-25 12:43:45
【问题描述】:

我知道已经有很多这样的问题,但我的情况很独特,到目前为止没有一个对我有帮助。

我正在编写一个脚本,它将重新格式化我的(标记不佳的)音乐库。目前格式为 Music/Genre/Artist/Album/##-Title.wav。

我从 Music 目录运行我的 script1,它调用 find -name "*.wav" -exec script2 {} ${other_args}。 Script2解析变量的路径,如果不存在则创建相应的输出目录,然后调用ffmpeg进行压缩。

例如:($sourcefilepath 包含来自 find 的 {})

ffmpeg -i "$sourcefilepath" "$path/$to/$outfile.$extension"

如果我的文件名或路径不包含空格,它就像一个魅力。

如果包含空格,ffmpeg会失败,报错如下:

蓝调/乡村蓝调/节奏、乡村与蓝调/08-Natalie Cole & Reba McEntire since I Fell For You.wav: 没有这样的文件或目录

注意:这是它找不到的源文件。输出文件似乎工作正常,即使有空格。这不是我正在运行的完整命令(它也有一些 -metadata 标志,但它似乎也可以正常工作。我正在使用上面编写的命令进行调试)。

这里有趣的是 ffmpeg 没有将 $sourcefilepath 解释为两个参数,它只是找不到我指定的文件。从 Music 目录运行以下命令。

ffmpeg -i Blues/Country\ Blues/Rhythm\,\ Country\ And\ Blues/08-Natalie\ Cole\ \&\ Reba\ McEntire\ \ \ Since\ I\ Fell\ For\ You.wav output.flac

我有点卡在这里。网络上的其他信息涉及获取命令以查看带有空格的变量作为一个 arg 而不是多个。我似乎已经这样做了,但是 ffmpeg 现在找不到我的文件了。

通常我只会使用find -name "*.wav" -exec ffmpeg -i {} ${args} \;,但我需要处理文件路径来提取我的元数据。

我对 shell 脚本还很陌生;有人知道这里发生了什么吗?

【问题讨论】:

标签: shell ffmpeg


【解决方案1】:

我的超能力表明,在您的代码中,您正在执行以下操作:

something=$(echo $filename | something)

这应该是:

something=$(echo "$filename" | something)

这是一个说明问题原因的脚本:

#!/bin/sh
filename="Reba McEntire   Since I fell"    
echo "$filename"    # Correct, quoted
echo $filename      # Incorrect, unquoted

它输出:

Reba McEntire   Since I fell
Reba McEntire Since I fell

你会注意到

  • 第一行在艺术家之后有 三个空格,如您的正确命令所示。
  • 第二行在艺术家之后有一个空格,如您的错误消息中所示。

这是由于未引用的变量扩展经历了分词。 echo 然后将参数与单个空格连接起来。最终结果是多个空格合并为一个空格。

【讨论】:

  • 你的精神力量是正确的;我正在将变量传递给 sed 并以这种方式剪切,以处理路径。非常感谢!
  • @JulianDelphiki 为了您的方便,shellcheck 会自动指出这个问题和其他问题。
猜你喜欢
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
相关资源
最近更新 更多