¿Cómo leer un archivo en una variable en el shell?

Quiero leer un archivo y guardarlo en una variable, pero necesito mantener la variable y no sólo imprimir el archivo. ¿Cómo puedo hacer esto? He escrito este script pero no es lo que necesitaba:

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

En mi script, puedo dar el nombre del archivo como un parámetro, por lo que, si el archivo contiene "aaaa", por ejemplo, se imprimiría esto:

aaaa
11111-----

Pero esto sólo imprime el archivo en la pantalla, ¡y yo quiero guardarlo en una variable! ¿Hay alguna manera fácil de hacer esto?

Solución

En la plataforma cruzada, el mínimo común denominador sh se utiliza:

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

En bash o zsh, para leer un archivo completo en una variable sin invocar cat:


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

Si quieres leer todo el archivo en una variable:

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

Si quieres leerlo línea por línea

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

Dos importantes escollos

que fueron ignorados por otras respuestas hasta ahora:

  1. Eliminación de la nueva línea al final de la expansión del comando
  2. Eliminación del carácter NUL

2. Eliminación de la nueva línea final de la expansión de comandos

Este es un problema para el:

value="$(cat config.txt)"

pero no para las soluciones basadas en read.

La expansión de comandos elimina las nuevas líneas finales:

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

Salidas:

0000000 61
0000001

Esto rompe el método ingenuo de lectura de archivos:


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