传递包含空格作为参数的shell变量(Passing shell variables contain

2019-10-21 05:14发布

我知道有很多的这些问题在那里了,但我的情况是独一无二的,以至于没有人迄今帮助了我。

我正在写一个脚本,将重新格式化我的(不良标记)的音乐库。 这是目前在音乐/流派/艺术家/专辑/ ##的形式 - 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的与伊泰里巴由于我爱上了You.wav:没有这样的文件或目录

注:这是源文件无法找到。 输出文件似乎正常工作,即使有空间。 这不是完整的命令我跑(它有一些 - 元数据标记过,但似乎也正常。我用我上面写的命令调试)。

这里有趣的是,ffmpeg的不解释$ sourcefilepath因为有两个参数,它只是找不到我指定的文件。 从运行音乐作品目录下面。

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

我有种被困在这里。 在网络上的其它信息,包括得到一个命令来查看一个变量为一个精氨酸,而不是多重的空间。 我似乎已经做到了,但现在的ffmpeg无法找到我的文件。

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

我是相当新的shell脚本; 有谁知道这是怎么回事呢?

Answer 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

你会发现,

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

这是由于未引用的变量扩展经受wordsplitting。 echo然后用串接单个空格的参数。 最终的结果是多个空格合并成一个空间。



文章来源: Passing shell variables containing spaces as arguments
标签: shell ffmpeg