Ich verwende diese Art von Code:
#!/usr/bin/env bash
set -u
exclude1='--exclude=/path/*'
exclude2='--exclude=/path with spaces/*'
exclude3='' # any 'exclude' can be empty
tar -czf backup.tgz "$exclude1" "$exclude2" "$exclude3" 2>&1 | grep -i 'my_reg_exp' > error.log
RESULT=("${PIPESTATUS[@]}")
... etc ...
Wenn ich diesen Code ausführe, wird folgende Fehlermeldung angezeigt:
tar: : Cannot stat: No such file or directory
Dies liegt daran, dass "$ exclude3" als leeres Argument übersetzt wird. Genau so, als hätte ich das getan:
tar -czf backup.tgz "$exclude1" "$exclude2" ''
Eine Möglichkeit, diesen Fehler zu vermeiden, besteht darin, die doppelten Anführungszeichen um $ excludeX zu entfernen. Dies ist jedoch ein Problem, wenn $ excludeX Leerzeichen oder andere seltsame Zeichen enthält.
Eine andere Möglichkeit wäre die Verwendung, eval
aber da ich die doppelten Anführungszeichen beibehalten muss, sehe ich nicht, wie die Anführungszeichen UND die leeren Argumente bei Bedarf unterdrückt werden können.
Die einzige Lösung, die ich gefunden habe, besteht darin, die Befehlszeile mit Zeichenfolgenverkettung zu erstellen:
CMD='tar -czf backup.tgz'
if [[ -n "$exclude1" ]]; then CMD+=" \"$exclude1\" "; fi
if [[ -n "$exclude2" ]]; then CMD+=" \"$exclude2\" "; fi
if [[ -n "$exclude3" ]]; then CMD+=" \"$exclude3\" "; fi
eval $CMD 2>&1 | grep -i 'my_reg_exp' > error.log
RESULT=("${PIPESTATUS[@]}")
... etc ...
Hat jemand eine klügere Idee?
${exclude3:+"$exclude3"}
(beachten Sie den Doppelpunkt).Verwenden Sie ein Array, da Sie in Bash arbeiten .
Wenn Sie einen optionalen Eintrag in einer Variablen haben, fügen Sie ihn in einer Bedingung hinzu.
quelle
Dies funktioniert für mich in Bash unter Ubuntu, aber ich habe keine Ahnung, ob es POSIX-kompatibel / kompatibel ist:
quelle