Come usare una variabile d'ambiente all'interno di una stringa tra virgolette in Bash

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

  •  20-08-2019
  •  | 
  •  

Domanda

Ho provato varie forme di quanto segue in uno script bash:

#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

Ma non riesco a ottenere la sintassi per espandere correttamente la variabile di ambiente COLUMNS .

Ho provato varie forme di quanto segue:

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'

e

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'

e

eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

Suggerimenti?

È stato utile?

Soluzione

In caso di dubbi, è possibile utilizzare la richiesta "cols" sul terminale e dimenticare COLONNE:

COLS=$(tput cols)

Altri suggerimenti

Solo una breve nota / sintesi per tutti coloro che sono venuti qui tramite Google alla ricerca della risposta alla domanda generale posta nel titolo (come ero). Uno dei seguenti dovrebbe funzionare per ottenere l'accesso alle variabili shell tra virgolette:

echo "$VARIABLE"
echo "${VARIABLE}"

L'uso di virgolette singole è il problema principale. Secondo il Manuale di riferimento di Bash :

  

Racchiudere i caratteri tra virgolette singole ( ') conserva il valore letterale di ciascun carattere tra virgolette. Tra virgolette singole non può verificarsi una virgoletta, anche se preceduta da una barra rovesciata.   [...]   Racchiudere i caratteri tra virgolette doppie ( " ) conserva il valore letterale di tutti i caratteri tra virgolette, ad eccezione di $ , `, < codice> \ e, quando l'espansione della cronologia è abilitata, ! . I caratteri $ e `mantengono il loro significato speciale tra virgolette doppie (vedi Espansioni della shell). La barra rovesciata conserva il suo significato speciale solo quando è seguita da uno dei seguenti caratteri: $ , `, " , \ o newline. Tra virgolette doppie, le barre rovesciate seguite da uno di questi caratteri vengono rimosse. Le barre rovesciate che precedono i caratteri senza un significato speciale vengono lasciate non modificate. Una virgoletta doppia può essere citata tra virgolette precedenti precedendola con una barra rovesciata. Se abilitato, l'espansione della cronologia verrà eseguita a meno che un ! che appare tra virgolette non sia evitato usando una barra rovesciata. La barra rovesciata che precede il ! non viene rimossa.   I parametri speciali * e @ hanno un significato speciale tra virgolette doppie (vedere Espansione parametri shell).

Nel caso specifico posto nella domanda, $ COLUMNS è una variabile speciale che ha proprietà non standard (vedi la risposta di lhunath sopra).

Nota che COLONNE è:

  1. NON una variabile di ambiente. È un normale parametro bash impostato da bash stesso.
  2. Impostato automaticamente alla ricezione di un segnale SIGWINCH .

Questo secondo punto di solito significa che la tua variabile COLUMNS sarà impostata solo nella tua shell interattiva , non in uno script bash.

Se il stdin del tuo script è collegato al tuo terminale, puoi cercare manualmente la larghezza del tuo terminale chiedendo al tuo terminale:

tput cols

E per usarlo nel tuo comando SVN:

svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"

(Nota: dovresti citare " $ @ " e stare lontano da eval ;-))

Il seguente script funziona per me per più valori di $ COLUMNS . Mi chiedo se non stai impostando COLONNE prima di questa chiamata?

#!/bin/bash
COLUMNS=30
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

Puoi riecheggiare $ COLUMNS all'interno del tuo script per vedere se è impostato correttamente?

Lo stai facendo bene, quindi immagino che qualcos'altro sia in errore (non esportare COLONNE?).

Un trucco per eseguire il debug di questi casi è quello di eseguire un comando specializzato (una chiusura per i ragazzi del linguaggio di programmazione). Crea uno script shell chiamato diff-colonne facendo:

exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"

e basta usare

svn diff "$@" --diff-cmd  diff-columns

In questo modo il tuo codice è più pulito da leggere e più modulare (approccio top-down) e puoi testare il codice delle colonne diff separatamente separatamente (approccio bottom-up).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top