Bash-Anführungszeichen in Variablen werden unterschiedlich behandelt, wenn sie zu Befehlen erweitert werden

Die Frage anhand von Beispielen erklären ...

Demonstriert, dass die einfachen Anführungszeichen nach --chapters beim Erweitern der Variablen maskiert werden (das habe ich nicht erwartet):

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.

Und jetzt erhält mkvpropedit aus irgendeinem Grund die doppelten Anführungszeichen als Teil des Dateinamens (das habe ich auch nicht erwartet):

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.

Der obige echo'd Befehl scheint korrekt zu sein. Wenn Sie denselben Text in ein anderes Skript einfügen, erhalten Sie das erwartete Ergebnis:

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.

Kann mir jemand erklären, warum sich die Anführungszeichen nicht wie erwartet verhalten? Ich fand es schwierig, zu diesem Thema zu suchen, da es im Web so viele andere Zitierdiskussionen gibt. Ich würde nicht einmal wissen, wie ich die Frage ohne Beispiele erklären könnte.

Ich befürchte, dass der Dateiname in dem Argument eines Tages ein Zeichen enthält, das alles kaputt macht, daher das möglicherweise übermäßige Zitieren. Ich verstehe nicht, warum der gleiche Befehl anders ausgeführt wird, wenn er direkt im Skript eingegeben oder über eine Variable bereitgestellt wird. Bitte erleuchte mich.

Danke fürs Lesen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage