Come leggere un file in una variabile nella shell?

Voglio leggere un file e salvarlo in una variabile, ma ho bisogno di mantenere la variabile e non solo stampare il file. Come posso farlo? Ho scritto questo script ma non è proprio quello di cui avevo bisogno:

#!/bin/sh
while read LINE  
do  
  echo $LINE  
done <$1  
echo 11111-----------  
echo $LINE  

Nel mio script, posso dare il nome del file come parametro, quindi, se il file contiene "aaaa", per esempio, stamperebbe questo:

aaaa
11111-----

Ma questo stampa solo il file sullo schermo, e io voglio salvarlo in una variabile! C'è un modo semplice per farlo?

Soluzione

In multipiattaforma, il minimo comune denominatore sh si usa:

#!/bin/sh
value=`cat config.txt`
echo "$value"

In bash o zsh, per leggere un intero file in una variabile senza invocare cat:


#!/bin/bash
value=$(
Commentari (15)

Se volete leggere l'intero file in una variabile:

#!/bin/bash
value=`cat sources.xml`
echo $value

Se vuoi leggerlo riga per riga:

while read line; do    
    echo $line    
done < file.txt
Commentari (4)

Due importanti insidie

che sono state ignorate dalle altre risposte finora:

  1. Rimozione del newline in coda all'espansione del comando
  2. Rimozione del carattere NUL

Rimozione del newline in coda all'espansione del comando

Questo è un problema per il:

value="$(cat config.txt)"

ma non per le soluzioni basate sulla lettura.

L'espansione dei comandi rimuove i newline in coda:

S="$(printf "a\n")"
printf "$S" | od -tx1

Uscite:

0000000 61
0000001

Questo rompe il metodo ingenuo di leggere dai file:


FILE="$(mktemp)"
printf "a\n\n" > "$FILE"
S="$(
Commentari (8)