通过例子解释问题...
表明当变量展开时, --chapters 之后的单引号被转义(我没想到会这样):
prompt@ubuntu:/my/scripts$ cat test1.sh
#!/bin/bash
actions="--tags all:"
actions+=" --chapters ''"
mkvpropedit "$1" $actions
prompt@ubuntu:/my/scripts$ ./test1.sh some.mkv
Error: Could not open '''' for reading.
现在由于某种原因 mkvpropedit 接收双引号作为文件名的一部分(我也没想到会这样):
prompt@ubuntu:/my/scripts$ cat test1x.sh
#!/bin/bash
command="mkvpropedit \"$1\""
command+=" --tags all:"
command+=" --chapters ''"
echo "$command"
$command
prompt@ubuntu:/my/scripts$ ./test1x.sh some.mkv
mkvpropedit "some.mkv" --tags all: --chapters ''
Error: Could not open '''' for reading.
上面的 echo'd 命令似乎是正确的。将相同的文本放在另一个脚本中会产生预期的结果:
prompt@ubuntu:/my/scripts$ cat test2.sh
#!/bin/bash
mkvpropedit "$1" --tags all: --chapters ''
prompt@ubuntu:/my/scripts$ ./test2.sh some.mkv
The file is being analyzed.
The changes are written to the file.
Done.
任何人都可以解释为什么报价没有按预期运行。我发现搜索这个问题很困难,因为网络上有很多其他的引用讨论。如果没有例子,我什至不知道如何解释这个问题。
恐怕有一天参数中的文件名包含一些会破坏所有内容的字符,因此可能会过度引用。我不明白为什么直接在脚本中键入或通过变量提供相同的命令时执行不同。请赐教。
谢谢阅读。