Wie kann ich diese Bash-Variable zum Laufen bringen: myformat="--format=fuller --date=format:%Y-%m-%d T%H"

Wie kann ich diese Bash-Variable zum Laufen bringen: myformat="--format=fuller --date=format:%Y-%m-%d T%H"

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 printfmit dem Anführungszeichen-Formatbezeichner verwenden:

printf -v myformat '%q %q' "$mypref" "$mydate"
git log $myformat

verwandte Informationen