620 votes

Lire un fichier dans une variable

Je veux lire un fichier et l'enregistrer dans une variable, mais j'ai besoin de garder la variable et pas seulement imprimer le fichier. Comment puis-je faire cela? J'ai écrit ce script, mais il n'est pas tout à fait ce dont j'avais besoin:

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

Dans mon script, je peux donner le nom de fichier comme paramètre, donc, si le fichier contient "aaaa", par exemple, il n'imprimez ce:

aaaa
11111-----

Mais cela imprime le fichier sur l'écran, et je veux l'enregistrer dans une variable! Est-il un moyen facile de faire cela?

1317voto

Alan Gutierrez Points 1411

En cross-plateforme, le plus petit dénominateur commun sh vous utilisez:

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

En bash ou zsh, pour lire tout un fichier dans une variable, sans invoquer cat:

#!/bin/bash
value=$(<config.txt)
echo "$value"

Invoquant cat en bash ou zsh pour siphonner un dossier sera considéré comme Inutile l'Utilisation de Chat.

Voir: Bash Hacker Wiki - Commande sur la substitution des Spécialités.

99voto

brain Points 1355

Si vous voulez lire le fichier entier dans une variable:

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

Si vous voulez le lire ligne par ligne:

 while read line; do    
    echo $line    
done < file.txt
 

95voto

Ciro Santilli Points 3341

Les autres réponses négligence deux pièges importants.

De fuite newline suppression

Commande d'extension supprime fin des retours à la ligne:

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

Sorties:

0000000 61
0000001

Cela rompt avec la méthode naïve de la lecture de fichiers:

FILE="$(mktemp)"
printf "a\n\n" > "$FILE"
S="$(<"$FILE")"
printf "$S" | od -tx1
rm "$FILE"

POSIX solution: ajouter un supplément de char à la commande de l'expansion et de l'enlever par la suite:

S="$(cat $FILE; printf a)"
S="${S%a}"
printf "$S" | od -tx1

Sorties:

0000000 61 0a 0a
0000003

Presque POSIX solution de contournement: ASCII de l'encodage. Voir ci-dessous.

NUL personnage de suppression

Il n'est pas sain d'esprit Bash moyen de stocker NUL personnages dans des variables.

Exemple:

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

Sorties:

0000000 61 00 62
0000003

0000000 61 62
0000002

Solutions:

  • ASCII de l'encodage. Voir ci-dessous.

  • utilisez bash extension $"" de littéraux:

    S=$"a\0b"
    printf "$S" | od -tx1
    

    Ne fonctionne que pour les littéraux, donc pas utile pour la lecture de fichiers.

  • l'utilisation de Python. Probablement la meilleure option. =)

Solution de contournement pour les pièges

Magasin un uuencode, encodé en base64 version du fichier dans la variable, et de décoder avant chaque utilisation:

FILE="$(mktemp)"
printf "a\0\n" > "$FILE"
S="$(uuencode -m "$FILE" /dev/stdout)"
uudecode -o /dev/stdout <(printf "$S") | od -tx1
rm "$FILE"

Sortie:

0000000 61 00 0a
0000003

uuencode et udecode sont POSIX 7 , mais pas dans Ubuntu 12.04 par défaut (sharutils package). Je ne vois pas POSIX 7 alternative pour le bash processus d' <() de substitution de l'extension de l'exception de l'écriture à un autre fichier.

Bien sûr, c'est lent et peu pratique, donc je suppose que la vraie réponse est: ne pas utiliser Bash.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X