2016-06-29 27 views
9

Ho una variabile FOO con me che deve essere assegnata con un valore che sarà più righe. Qualcosa di simile,Come assegnare un valore di linea multiplo a una variabile bash

FOO="This is line 1 
    This is line 2 
    This is line 3" 

Così, quando si stampa il valore di FOO dovrebbe dare il seguente output.

echo $FOO 
output: 
This is line 1 
This is line 2 
This is line 3 

Inoltre, il numero di righe verrà deciso dinamicamente in quanto verrà inizializzato utilizzando un ciclo.

Le risposte che sono state mostrate nell'altra domanda utilizzando principalmente read -d non sono adatte per me poiché sto eseguendo operazioni intensive su stringhe e anche il formato del codice è importante.

+2

Rimuovere principali spazi bianchi in linea 2 e 3 ed impiego: 'echo "$ FOO"' – Cyrus

risposta

22

Non rientrare le righe o avrai spazi aggiuntivi. Utilizzare le virgolette quando si espande "$FOO" per garantire che le nuove righe vengano mantenute.

$ FOO="This is line 1 
This is line 2 
This is line 3" 
$ echo "$FOO" 
This is line 1 
This is line 2 
This is line 3 

Un altro modo è utilizzare le sequenze di escape \n. Sono interpretati all'interno delle stringhe $'...'.

$ FOO=$'This is line 1\nThis is line 2\nThis is line 3' 
$ echo "$FOO" 

Un terzo modo è quello di memorizzare i caratteri \ e n, e poi hanno echo -e interpretare le sequenze di escape. È una sottile differenza. La parte importante è che \n non è interpretato all'interno di virgolette regolari.

$ FOO='This is line 1\nThis is line 2\nThis is line 3' 
$ echo -e "$FOO" 
This is line 1 
This is line 2 
This is line 3 

Si può vedere la distinzione che sto facendo, se si rimuovere l'opzione -e e hanno echo stampare la stringa grezzo senza interpretare nulla.

$ echo "$FOO" 
This is line 1\nThis is line 2\nThis is line 3 
+0

Ciao John, il tuo codice di esempio funziona per me! Tuttavia, nel primo esempio sopra, quando echo la variabile con '' 'echo $ FOO''' senza mettere $ FOO tra le virgolette, l'output è sulla stessa riga. Sai perché? Sto usando GNU bash, versione 4.3.11 (1) -release su Ubuntu 14.04. – yaobin

+0

Ecco cosa succede quando non hai virgolette. Il valore è soggetto a * suddivisione di parole * e * espansione globale *. Invece di "echo" viene detto di stampare un argomento con le nuove linee incorporate, ogni parola di "$ FOO" diventa un argomento separato senza nessuna nuova riga. È come se scrivessi 'echo Questa è la linea 1 Questa è la linea 2 Questa è la linea 3'. Bottom line: cita sempre le espansioni variabili a meno che tu non voglia che sia soggetto alla divisione delle parole e al globbing (raro). –

3

Quando si inizializza FOO è necessario utilizzare interruzioni di riga: \n.

FOO="This is line 1\nThis is line 2\nThis is line 3" 

Quindi utilizzare echo -e all'uscita FOO.

E 'importante notare che \n all'interno "..." NON è un'interruzione di linea, ma letterale \, seguito da letterale n. È solo se interpretato da echo -e che questa sequenza letterale viene convertita in un carattere di nuova riga. - sagge parole da mklement0


#!/bin/bash 

FOO="This is line 1\nThis is line 2\nThis is line 3" 
echo -e $FOO 

Output: 
This is line 1 
This is line 2 
This is line 3 
+0

sua dando uscita come '-e Questa è la riga 1 Questa è la riga 2 Questa è la riga 3' – juned

+0

Grazie. Funziona per me. – molecule

+2

@juned Avete bisogno di una versione di 'echo' che supporti' -e'. Il comando echo di Bash incorporato fa, così come il binario '/ bin/echo' di GNU. –

Problemi correlati