766 Stimmen

Wie liest man eine Datei in eine Variable in der Shell?

Ich möchte eine Datei lesen und sie in einer Variablen speichern, aber ich muss die Variable behalten und nicht nur die Datei ausdrucken. Wie kann ich das machen? Ich habe dieses Skript geschrieben, aber es ist nicht ganz das, was ich brauche:

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

In meinem Skript kann ich den Dateinamen als Parameter angeben. Wenn die Datei also beispielsweise "aaaa" enthält, würde das Skript Folgendes ausgeben:

aaaa
11111-----

Aber das gibt die Datei nur auf dem Bildschirm aus, und ich möchte sie in einer Variablen speichern! Gibt es eine einfache Möglichkeit, dies zu tun?

6voto

dimo414 Punkte 44554

Als Ciro Santilli schreibt Bei der Verwendung von Befehlssubstitutionen werden nachstehende Zeilenumbrüche weggelassen. Ihr Workaround, der nachgestellte Zeichen hinzufügt, ist großartig, aber nachdem ich ihn einige Zeit verwendet hatte, beschloss ich, dass ich eine Lösung brauchte, die überhaupt keine Befehlssubstitution verwendet.

Mein Ansatz verwendet nun read zusammen mit dem printf eingebaut -v Flagge um den Inhalt von stdin direkt in eine Variable zu lesen.

# Reads stdin into a variable, accounting for trailing newlines. Avoids
# needing a subshell or command substitution.
# Note that NUL bytes are still unsupported, as Bash variables don't allow NULs.
# See https://stackoverflow.com/a/22607352/113632
read_input() {
  # Use unusual variable names to avoid colliding with a variable name
  # the user might pass in (notably "contents")
  : "${1:?Must provide a variable to read into}"
  if [[ "$1" == '_line' || "$1" == '_contents' ]]; then
    echo "Cannot store contents to $1, use a different name." >&2
    return 1
  fi

  local _line _contents=()
   while IFS='' read -r _line; do
     _contents+=("$_line"$'\n')
   done
   # include $_line once more to capture any content after the last newline
   printf -v "$1" '%s' "${_contents[@]}" "$_line"
}

Dies unterstützt Eingaben mit oder ohne nachfolgende Zeilenumbrüche.

Beispiel für die Verwendung:

$ read_input file_contents < /tmp/file
# $file_contents now contains the contents of /tmp/file

-2voto

Prakash D Punkte 333

Mit der for-Schleife können Sie jeweils auf 1 Zeile zugreifen

#!/bin/bash -eu

#This script prints contents of /etc/passwd line by line

FILENAME='/etc/passwd'
I=0
for LN in $(cat $FILENAME)
do
    echo "Line number $((I++)) -->  $LN"
done

Kopieren Sie den gesamten Inhalt in eine Datei (z.B. line.sh ) ; Führen Sie sie aus

chmod +x line.sh
./line.sh

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X