Dies ist eine Frage dazu, wie Bash mit Wortgruppierung und Variablenerweiterung umgeht. Ich werde die Frage anhand eines sehr konkreten Beispiels veranschaulichen:
bash$ git log --format=fuller --date=format:"%Y-%m-%d T%H" # This works.
# Sample output:
commit aba22155684
Author: SerMetAla
AuthorDate: 2018-04-12 T23
Commit: SerMetAla
CommitDate: 2018-04-12 T23
Here is the commit message.
Ich möchte, dass dies funktioniert:
bash$ git log "$myformat" # It should print the same stuff.
Ich weiß nicht, wie ich das mit nur einer Bash-Variable hinbekomme. Hier ist ein funktionierendes Beispiel mit ZWEI Variablen:
# Define the two variables:
bash$ mypref="--format=fuller"
bash$ mydate="--date=format:%Y-%m-%d T%H" # Note: No " after the colon.
# Now use it:
bash$ git log "$mypref" "$mydate" # It works.
Das Problem ist folgendes: Wie kann ich das mit nur einer Bash-Variable zum Laufen bringen? Ist das möglich?
Das Hauptproblem:
git log --format=fuller --date=format:"%Y-%m-%d T%H"
| ^ This space is inside one argument.
|
^ This space separates two arguments.
Ich möchte eine normale String-Variable verwenden. Ich möchte keine Array-Variable verwenden, ich möchte keine verwenden $'...'
, ich möchte keine Funktion verwenden, ich möchte keinen Alias verwenden. Wenn der String unveränderlich ist und wenn er nicht am Anfang des Befehls steht, fühlt es sich an, als sollte es eine Bash-Variable sein.
Ich könnte das sehr leicht mit einer Funktion auf eine einigermaßen lesbare Weise lösen. Ich könnte es mit anderen Bash-Tricks auf eine Weise lösen, die erschreckend wäre. Ich möchte eine String-Variable verwenden.
Antwort1
Ich möchte keine Array-Variable verwenden
Sie lehnen ein geeignetes Werkzeug für die Aufgabe ab. Nun, Sie können es mit Folgendem versuchen eval
:
$> foo='a "b c"'
$> printf "%s\n" $foo
a
"b
c"
$> eval printf '"%s\n"' $foo
a
b c
$>
In Deinem Fall würde das etwa so aussehen:
myformat='--format=fuller --date=format:"%Y-%m-%d T%H"'
eval git log $myformat
Antwort2
Dies ist eine häufig gestellte Frage.https://mywiki.wooledge.org/BashFAQ/050
Kurz gesagt besteht die Lösung darin, die Argumente in einem Array zu platzieren.
myformat=("$mypref" "$mydate")
git log "${myformat[@]}"
Als sehr einfache Problemumgehung können Sie auch Folgendes printf
mit dem Anführungszeichen-Formatbezeichner verwenden:
printf -v myformat '%q %q' "$mypref" "$mydate"
git log $myformat