Angesichts dieser Bash:
PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo $PARMS
rsync ${PARMS} . ${TARGET}
Das Echo zeigt die PARMS-Zeichenfolge wie erwartet an, es wird kein Fehler angezeigt, aber rsync verhält sich im Hintergrund so, als ob die mit + = hinzugefügten Optionen nicht vorhanden wären. Dies funktioniert jedoch wie erwartet:
PARMS='-rvu'
rsync ${PARMS} --delete --exclude='.git' . ${TARGET}
Ich glaube, ich habe etwas mit Bash-Anführungszeichen vermasselt (hatte immer Probleme damit), bin mir aber nicht ganz sicher, was und warum die Optionen ignoriert werden, obwohl die Zeichenfolge anscheinend korrekt erstellt wurde.
echo "$PARMS"
undrsync "${PARMS}"
...bash
Version 4.2.25 ohne Änderungen.Antworten:
Es gibt einen Unterschied zwischen:
und
Im ersten Fall handelt es sich bei den einfachen Anführungszeichen um innere Anführungszeichen, sodass sie im ersetzten Text, der
rsync
als Argumente angegeben wird, buchstäblich vorkommen .rsync
bekommt ein Argument dessen Wert ist--exclude='.git'
. In der zweiten werden die einzelnen Anführungszeichen von der Shell zum Zeitpunkt des Schreibens interpretiert, da sie nicht in Anführungszeichen stehen undrsync
zu sehen sind--exclude=.git
.In diesem Fall brauchen Sie die einfachen Anführungszeichen überhaupt nicht - es
.git
handelt sich um ein vollständig gültiges Shell-Wort ohne Sonderzeichen, sodass Sie es wörtlich im Befehl verwenden können.Besser für diese Art von Dingen ist jedoch ein Array :
Dies baut Ihren Befehl als separate Wörter auf, wobei die zu interpretierenden Anführungszeichen zum Zeitpunkt des Schreibens der Array-Zeile verwendet werden.
"${PARMS[@]}"
Erweitert jeden Eintrag im Array als separates Argument, auch wenn das Argument selbst Sonderzeichen oder Leerzeichen enthält. Sie sehen alsorsync
, was Sie geschrieben haben, wie Sie es gemeint haben.quelle
bash
Wortteilung durchgeführt, nachdem${PARMS}
erweitert wurde. Das einfache Anführungszeichen wurde also auch von der Shell interpretiert.\
,'
und"
. , Die nicht aus einem der oben genannten Erweiterungen geführt haben entfernt werden“ "über Erweiterungen" beinhaltet Parametererweiterung, die die Erweiterung von ausführt${PARMS}
.IFS
(im Allgemeinen Leerzeichen) sind, müssen Sie sie nicht in Anführungszeichen setzen. Wenneval
dies der Fall ist , haben Sie Pech, es sei denn, Sie hacken etwas zusammen mit - dies ist im Allgemeinen ein Misserfolg, und Arrays sind der richtige Weg, damit umzugehen.Neben @ Michael Homers Antwort , können Sie
bash
Funktion eval :quelle
eval
.