Hoe lees ik een bestand in een variabele in shell?

Ik wil een bestand lezen en het opslaan in een variabele, maar ik moet de variabele behouden en niet alleen het bestand afdrukken. Hoe kan ik dit doen? Ik heb dit script geschreven maar het is niet helemaal wat ik nodig had:

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

In mijn script kan ik de bestandsnaam als parameter meegeven, dus als het bestand bijvoorbeeld "aaaa" bevat, dan zou het dit afdrukken:

aaaa
11111-----

Maar dit drukt alleen het bestand af op het scherm, en ik wil het opslaan in een variabele! Is er een makkelijke manier om dit te doen?

Oplossing

In cross-platform, kleinste gemene deler sh gebruik je:

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

In bash of zsh, om een heel bestand in een variabele te lezen zonder cat aan te roepen:


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

Als u het hele bestand in een variabele wilt lezen:

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

Als u het regel voor regel wilt lezen:

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

Twee belangrijke valkuilen

die tot nu toe in andere antwoorden zijn genegeerd:

  1. Nieuwe regel verwijderen uit opdrachtuitbreiding
    1. NUL karakter verwijdering

Verwijdering van een nieuwe regel aan het einde van een opdrachtuitbreiding

Dit is een probleem voor de:

value="$(cat config.txt)"

type oplossingen, maar niet voor read gebaseerde oplossingen.

Commando uitbreiding verwijdert nieuwe regels achteraan:

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

Uitvoer:

0000000 61
0000001

Dit breekt de naïeve methode van het lezen uit bestanden:


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