Come scrivere una stringa su più righe usando Bash con variabili?


232

Come posso scrivere più righe in un file chiamato myconfig.confusando BASH?

#!/bin/bash
kernel="2.6.39";
distro="xyz";

echo <<< EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL >> /etc/myconfig.conf;
cat /etc/myconfig.conf;

Risposte:


471

La sintassi ( <<<) e il comando utilizzato ( echo) sono errati.

Corretto sarebbe:

#!/bin/bash

kernel="2.6.39"
distro="xyz"
cat >/etc/myconfig.conf <<EOL
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
EOL

cat /etc/myconfig.conf

Questa costruzione viene definita documento Here e può essere trovata nelle pagine man di Bash man --pager='less -p "\s*Here Documents"' bash.


49
e se vuoi aggiungere sarebbe gatto >>
O Gal

19
Funziona alla grande, ma devi assicurarti che non ci siano spazi bianchi davanti alla terminazione EOF, altrimenti non verrà riconosciuto e ti imbatterai in una fine imprevista dell'errore del file .
nwinkler,

10
@StevenEckhoff Questo si chiama ereditario.
William Pursell,

4
Cosa succede se ho bisogno dell'autorizzazione sudo per scrivere sul file?
gfpacheco,

14
@gfpacheco Puoi usare tee per questo, come cat << EOL | sudo tee /etc/myconfig.conf
Xin Chen

74
#!/bin/bash
kernel="2.6.39";
distro="xyz";

cat > /etc/myconfig.conf << EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL

questo fa quello che vuoi.


6
@ktf Stavo scrivendo non più velocemente, ma meno lettere di te. ^ _ *
Kent,

35

Se non si desidera sostituire le variabili, è necessario racchiudere EOL tra virgolette singole.

cat >/tmp/myconfig.conf <<'EOL'
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
EOL

Esempio precedente:

$ cat /tmp/myconfig.conf 
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 

14

Le soluzioni ereditarie sono sicuramente il modo più comune per farlo. Altre soluzioni comuni sono:

echo 'line 1,' "$ {kernel}" '
linea 2,
riga 3, '"$ {distro}"'
riga 4 '> /etc/myconfig.conf

e

exec 3> & 1 # Salva lo stdout corrente
exec> /etc/myconfig.conf
echo line 1, $ {kernel}
linea di eco 2, 
linea di eco 3, $ {distro}
...
exec 1> & 3 # Ripristina stdout

Forse anche indicare a printfche introduce ancora alcune varianti più interessanti.
Tripleee,

3

Il meccanismo seguente aiuta a reindirizzare più righe su file. Mantieni la stringa completa in "modo da poter reindirizzare i valori della variabile.

#!/bin/bash
kernel="2.6.39"
echo "line 1, ${kernel}
line 2," > a.txt
echo 'line 2, ${kernel}
line 2,' > b.txt

Il contenuto di a.txtè

line 1, 2.6.39
line 2,

Il contenuto di b.txtè

line 2, ${kernel}
line 2,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.