Wie eine Umgebungsvariable in einer Zeichenfolge in Anführungszeichen in Bash verwenden
-
20-08-2019 - |
Frage
Ich habe verschiedene Formen der folgenden in einem Bash-Skript versucht:
#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Aber ich kann nicht die Syntax lernen richtig COLUMNS
Umgebungsvariable zu erweitern.
Ich habe verschiedene Formen der folgende versucht:
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'
und
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'
und
eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Verbesserungsvorschläge?
Lösung
Wenn Sie unsicher sind, könnten Sie die "cols Antrag auf dem Terminal verwenden und vergessen SÄULEN:
COLS=$(tput cols)
Andere Tipps
Nur eine kurze Notiz / Zusammenfassung für jeden, der hier über Google für die Antwort auf die allgemeine Frage im Titel fragte die Suche kam (wie ich). Jede der folgenden sollte für immer Zugriff auf Shell-Variablen in Anführungszeichen arbeiten:
echo "$VARIABLE"
echo "${VARIABLE}"
Die Verwendung von einfachen Anführungszeichen ist das Hauptproblem. Nach dem Bash Reference Manual :
Zeichen in einfachen Anführungszeichen (
'
) bewahrt die wörtliche Wert jedes Zeichen innerhalb der Anführungszeichen gesetzt. Ein Apostroph kann nicht zwischen einfachen Anführungszeichen auftreten, auch wenn sie von einem Backslash. [...] Zeichen in doppelten Anführungszeichen ("
) bewahrt den wörtlichen Wert aller Zeichen innerhalb der Anführungszeichen, mit Ausnahme von$
,`
,\
umschließenden, und, wenn die Geschichte Erweiterung aktiviert ist,!
. Die Zeichen$
und `behalten ihre besondere Bedeutung in doppelte Anführungszeichen (siehe Shell Expansions). Der Backslash behält seine besondere Bedeutung nur, wenn sie durch eine der folgenden Zeichen folgen:$
,`
,"
,\
oder Newline. In doppelte Anführungszeichen, Schrägstriche, die durch eines dieser Zeichen gefolgt sind, werden entfernt. Schrägstriche Zeichen ohne spezielle Bedeutung vorhergehenden sind unmodifizierte links. Ein Doppel Zitat kann es durch vorhergehende mit einem Backslash in doppelten Anführungszeichen angegeben werden. Wenn aktiviert, wird die Geschichte Expansion durchgeführt werden, es sei denn, ein!
in doppelte Anführungszeichen erscheinen, einen umgekehrten Schrägstrich verwendet. Der umgekehrte Schrägstrich, die!
vorhergehende wird nicht entfernt. Die spezielle Parameter*
und@
haben eine besondere Bedeutung, wenn sie in doppelten Anführungszeichen (siehe Shell Parameter Expansion).
Im konkreten Fall in der Frage gestellt, ist $ columns eine spezielle Variable, die Nicht-Standard-Eigenschaften (lhunath Antwort siehe oben).
Beachten Sie, dass COLUMNS
ist:
- nicht eine Umgebungsvariable. Es ist ein gewöhnlicher bash Parameter, die von bash selbst festgelegt ist.
- Stellen Sie automatisch beim Empfang eines
SIGWINCH
Signal.
Der zweite Punkt in der Regel bedeutet, dass Ihre COLUMNS
Variable nur in festgelegt werden, um Ihr interaktiv Shell nicht in einem Bash-Skript.
Wenn Ihr Skript stdin
an Ihrem Terminal verbunden ist, manuell die Breite Ihres Terminal nachschlagen kann das Terminal mit der Frage:
tput cols
Und zu verwenden, um dies in Ihrem SVN-Befehl:
svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"
(Hinweis: Sie sollten Zitat: "$@"
und bleiben weg von eval
; -))
Das folgende Skript funktioniert für mich für mehrere Werte von $COLUMNS
. Ich frage mich, wenn Sie nicht COLUMNS
vor dieser Anrufeinstell-?
#!/bin/bash
COLUMNS=30
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Kann echo Sie in Ihrem Skript $COLUMNS
zu sehen, ob es richtig eingestellt?
Sie tun es richtig, also denke ich, etwas anderes schuld ist (nicht exportieren-ing SÄULEN?).
Ein Trick, um diese Fälle zu debuggen ist ein spezielles Kommando (eine Schließung für Programmiersprache Männer) zu machen. Erstellen Sie ein Shell-Skript namens diff-Spalten zu tun:
exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"
und nur verwenden
svn diff "$@" --diff-cmd diff-columns
Auf diese Weise Ihr Code ist sauberer zu lesen und modularer (top-down-Ansatz), und Sie können die diff-Spalten Code testen thouroughly separat (Bottom-up-Ansatz).