2016-10-17 1 views
2

Ich habe ein Git-Befehl, Ich mag würde in meinem Skript auszuführen:Bash: Wie man Befehl ausführt, der Anführungszeichen erwartet, die eine Variable verwenden?

git filter-branch -f --env-filter "STUFF HERE IN QUOTES" 

Die Sache ist, die ich in meinem Skript dynamisch die Zeichenfolge erschaffe, die von STUFF HERE IN QUOTES dargestellt wird:

ENVFILTER="" 
while read commit; do 
    IFS="|" read date hash message <<< "$commit" 
    DATE_NO_SPACE="$(echo "${date}" | tr -d '[[:space:]]')" 
    COMMIT_ENV=$(cat <<-END 
     if [ \$GIT_COMMIT = $hash ] 
     then 
     export GIT_AUTHOR_DATE="$DATE_NO_SPACE" 
     export GIT_COMMITTER_DATE="$DATE_NO_SPACE" 
     fi 
    END 
    ) 
    ENVFILTER="$ENVFILTER$COMMIT_ENV" 
done < $tmpfile 
git filter-branch -f --env-filter \'"$ENVFILTER"\' // <---------- does not work 

Im Grunde beginne ich mit einer leeren Zeichenkette ENVFILTER und concat mit anderen Strings, um eine Menge von if-Anweisungen zu bilden. Ich habe Probleme mit dem letzten Schritt, der den eigentlichen Befehl ausführt. Ich weiß nicht, wie ich es mit den erwarteten Anführungszeichen und dem interpolierten Wert ausführen soll.

=== UPDATE ===

Nach einem Blick auf @ chepner Antwort und mit "$ENVFILTER", kann ich jetzt erfolgreich den Befehl ausführen. Also ist die Antwort richtig.

Allerdings gibt es ein Fehler zu meinen if Aussagen (nicht auf die Zitate bezogen):

Rewrite eeb8860c13179c931a513a9ada76dc109324d790 (1/17)/opt/boxen/homebrew/Cellar/git/2.6.2/libexec/git-core/git-filter-branch: eval: line 313: syntax error near unexpected token `if' 
/opt/boxen/homebrew/Cellar/git/2.6.2/libexec/git-core/git-filter-branch: eval: line 313: `  fi  if [ $GIT_COMMIT = 08a2d85f9412c67435929d80ccc5b914f3ad8547 ]' 
env filter failed:  if [ $GIT_COMMIT = 59d13c174c34b6540f61585ef507abcef29ab22e ] 
    then 
export GIT_AUTHOR_DATE="2016-10-02T21:16:37-04:00" 
export GIT_COMMITTER_DATE="2016-10-02T21:16:37-04:00" 
    fi  if [ $GIT_COMMIT = 08a2d85f9412c67435929d80ccc5b914f3ad8547 ] 
    then 
export GIT_AUTHOR_DATE="2016-08-31T17:54:28-04:00" 
export GIT_COMMITTER_DATE="2016-08-31T17:54:28-04:00" 
    fi  if [ $GIT_COMMIT = d7801396f5fb1092beec3aa484361cd50ab35e9e ] 
    then 
export GIT_AUTHOR_DATE="2016-08-31T17:53:07-04:00" 
export GIT_COMMITTER_DATE="2016-08-31T17:53:07-04:00" 
    fi  if [ $GIT_COMMIT = 7930e9be149a57229c9fc26ccffe1c6453317d70 ] 
    then 
export GIT_AUTHOR_DATE="2016-08-31T17:48:03-04:00" 
export GIT_COMMITTER_DATE="2016-08-31T17:48:03-04:00" 
    fi  if [ $GIT_COMMIT = f0849b2de99ac37790eaf6e40c8980988e865c7c ] 
    then 
export GIT_AUTHOR_DATE="2016-08-31T17:46:33-04:00" 
export GIT_COMMITTER_DATE="2016-08-31T17:46:33-04:00" 
    fi 
[ 

Gibt es etwas falsch mit ihm? Ich verstehe es nicht

+0

Der Befehl * nicht * eigentlich erwarten, dass wörtliche Zitate. Wenn in der Dokumentation Anführungszeichen stehen, sind dies * syntaktische * Anführungszeichen, die * an die Shell *, nicht an 'git', andeuten, der Inhalt sollte als einzelnes Argument übergeben werden; Dieses Argument, das von der Shell im Array "argv" übergeben wird, enthält nur literalen Inhalt. Die Syntax wird während der Verarbeitung der Shell entfernt. –

+0

Sieht so aus, als hätten Sie das '' '' nicht in die Anführungszeichen gesetzt, wie es in der Antwort von chepner war? –

+0

ooo ist das erforderlich? so wie dieses 'wenn ...; dann ...; fi; ' – Edmund

Antwort

3

Unter der Annahme, dass ENVFILTER den richtigen Code enthält, das alles ist, was Sie brauchen:

git filter-branch -f --env-filter "$ENVFILTER" 

Sonderzeichen im Wert von ENVFILTER übergeben werden, wie sie ist zu git so lange wie die Erweiterung zitiert wird.


Das heißt, würde ich den Generator ein wenig aufzuräumen:

envfilter= 
while IFS="|" read -r date hash message; do 
    envfilter+="if [ \$GIT_COMMIT = \"$hash\" ]; then echo \"here\"; fi;" 
done < "$tmpfile" 
git filter-branch -f --env-filter "$envfilter" 
+0

Ich würde es ein bisschen mehr aufräumen - es gibt keine Notwendigkeit, Code-Generierung hier zu machen; Wir könnten auf eine Umgebungsvariable für Inhalte zurückverwenden, mit denen sie übereinstimmen. –

+0

oooo cool! Ich werde meine Antwort aktualisieren, um den tatsächlichen Code in meinem Skript anzuzeigen. es beschwert sich über meine if-Aussagen. eine Sekunde – Edmund

+0

BTW, nehme ich an, das Leerzeichen vor dem "" | "" ist fehlerhaft? –

Verwandte Themen