传递包含空格作为参数的shell变量

时间:2014-10-29 17:12:30

标签: shell ffmpeg

我知道这些问题已经存在很多,但我的情况非常独特,到目前为止他们都没有帮助过我。

我正在编写一个脚本,它将重新格式化我(标记不佳的)音乐库。它目前采用音乐/流派/艺术家/专辑/ ## - Title.wav的形式。

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

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

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

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

如果它包含空格,则ffmpeg失败,出现以下错误:

  蓝调/乡村蓝调/节奏,乡村和布鲁斯/ 08-Natalie Cole&雷巴   McEntire因为我为You.wav而崩溃:没有这样的文件或目录

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

这里有趣的是ffmpeg不会将$ sourcefilepath解释为两个args,它只是找不到我指定的文件。从音乐目录运行以下内容。

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

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

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

我是shell脚本的新手;有谁知道这里发生了什么?

1 个答案:

答案 0 :(得分:2)

我的精神力量表明,在您的代码中的某些时刻,您可以按照以下方式执行某些操作:

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然后将参数与单个空格连接起来。最终结果是多个空格合并为一个空格。