将文件传递给命令时如何处理名称中包含空格的文件

how to deal with files that have spaces in their names when passing it to a command

我是 bash 的新手,正在编写一个 shell 脚本来将一些元数据添加到音乐文件中,文件名 space 中有一些

FFMPEG_TARGET_COMMAND="\"$INPUT_DIRECTORY\" $SOME_METADATA_ARG \"$OUTPUT_DIRECTORY\""

echo $FFMPEG_TARGET_COMMAND
> "/user/musicEx/Dream In Drive.mp3" \
-metadata album="soundtrack" \
-codec copy "/user/output/Dream In Drive.mp3"
ffmpeg -i $FFMPEG_TARGET_COMMAND

我得到了“/user/musicEx/Dream:没有那个文件或目录

但是如果我通过输入

在 shell 中执行
ffmpeg -i "/user/musicEx/Dream In Drive.mp3" \
-metadata album="soundtrack" \
-codec copy "/user/output/Dream In Drive.mp3"

这会起作用

我不知道为什么。我已经转义了 $FFMPEG_TARGET_COMMAND 中的引号。我试图转义 space 字符,但它也没有用。

另外,我尝试将它们全部放入一个变量中:

COMMAND="ffmpeg -i \"/user/musicEx/SCARLET NEXUS.mp3\"  -codec copy \"/user/output/SCARLET NEXUS.mp3\""

我按$COMMAND

执行

那么,在脚本中,如何处理名称中包含[=36​​=]的文件?

使用 bash 个数组。

SOME_METADATA_ARGS=( -metadata album="soundtrack" )
ffmpeg_args=( "$INPUT_DIRECTORY" "${SOME_METADATA_ARGS[@]}" -codec copy "$OUTPUT_DIRECTORY" )
ffmpeg -i "${ffmpeg_args[@]}"

how to deal with files that have spaces in their names when passing it to a command

适当引用变量展开,禁止分词展开。使用 shellcheck 检查你的脚本。这不是您放入变量中的内容,而是您使用 变量的方式。阅读 https://mywiki.wooledge.org/BashFAQ/020https://mywiki.wooledge.org/BashFAQ/050.

没有理由SHOUT_THAT_MUCH。更喜欢对局部 non-exported 变量使用小写变量。