it-swarm.com.de

Wie verwende ich eine Bash-Variable (Zeichenfolge), die Anführungszeichen in einem Befehl enthält?

Fehlerhaftes, vereinfachtes Beispiel:

FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2

Ich muss die Anführungszeichen einfügen, als ob der Befehl so wäre:

rsync --archive --exclude="foo bar.txt" dir1 dir2
44
Reilly Beacom

Kurze Antwort: Siehe BashFAQ # 50 ("Ich versuche, einen Befehl in eine Variable zu schreiben, aber die komplexen Fälle schlagen immer fehl!").

Lange Antwort: Das Einfügen von Befehlen (oder Teilen von Befehlen) in Variablen und die anschließende Wiederherstellung ist kompliziert. Wenn die Shell eine Variable in der Befehlszeile erweitert und die Variable in doppelten Anführungszeichen angegeben wurde, wird sie nicht analysiert. Wenn es nicht in Anführungszeichen steht, werden Leerzeichen als Argumentumbrüche analysiert, aber Anführungszeichen und Escapezeichen werden nicht analysiert. In beiden Fällen ist es nicht sinnvoll, Anführungszeichen in den Wert der Variablen einzufügen.

Normalerweise ist die beste Möglichkeit, dies zu tun, die Verwendung eines Arrays anstelle einer einfachen Textvariablen:

FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2
50
Gordon Davisson