Wie eine Umgebungsvariable in einer Zeichenfolge in Anführungszeichen in Bash verwenden

StackOverflow https://stackoverflow.com/questions/840536

  •  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?

War es hilfreich?

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:

  1. nicht eine Umgebungsvariable. Es ist ein gewöhnlicher bash Parameter, die von bash selbst festgelegt ist.
  2. 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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top