it-swarm.com.de

Wie lese ich eine Variable aus einer Datei?

Ich möchte in mein Skript einen Wert (String) einfügen, den ich aus einer Textdatei lesen würde.

Zum Beispiel anstelle von:

echo "Enter your name"
read name

Ich möchte eine Zeichenfolge aus einer anderen Textdatei lesen, sodass der Interpreter die Zeichenfolge aus der Datei und nicht die Benutzereingabe lesen sollte.

64
user208413

Um Variablen aus einer Datei zu lesen, können wir den Befehl source oder . verwenden.

Nehmen wir an, die Datei enthält die folgende Zeile

MYVARIABLE="Any string"

diese Variable können wir dann mit importieren

#!/bin/bash

source <filename>
echo $MYVARIABLE
94
Takkat

Angenommen, Sie möchten, dass der gesamte Inhalt Ihrer Textdatei in Ihrer Variablen gespeichert wird, können Sie Folgendes verwenden:

#!/bin/bash

file="/path/to/filename" #the file where you keep your string name

name=$(cat "$file")        #the output of 'cat $file' is assigned to the $name variable

echo $name               #test

Oder in reiner Bash:

#!/bin/bash

file="/path/to/filename"     #the file where you keep your string name

read -d $'\x04' name < "$file" #the content of $file is redirected to stdin from where it is read out into the $name variable

echo $name                   #test
54
Radu Rădeanu

In Ihrem Skript können Sie dies tun:

read name < file_containing _the_answer

Sie können dies sogar mehrmals tun, z. in einer Schleife

while read LINE; do echo "$LINE"; done < file_containing_multiple_lines
11
thom

Eine alternative Möglichkeit besteht darin, die Standardeingabe einfach in Ihre Datei umzuleiten. Dort haben Sie alle Benutzereingaben in der Reihenfolge, in der sie vom Programm erwartet werden. Zum Beispiel mit dem Programm (genannt script.sh)

#!/bin/bash
echo "Enter your name:"
read name
echo "...and now your age:"
read age

# example of how to use the values now stored in variables $name and $age
echo "Hello $name. You're $age years old, right?"

und die Eingabedatei (genannt input.in)

Tomas
26

sie können dies auf zwei Arten vom Terminal aus ausführen:

$ cat input.in | ./script.sh
$ ./script.sh < input.in

und es wäre gleichbedeutend mit dem Ausführen des Skripts und dem manuellen Eingeben der Daten - es würde die Zeile "Hallo Tomas. Du bist 26 Jahre alt, oder?".

Wie Radu Rădeanbereits vorgeschlagen , können Sie cat in Ihrem Skript verwenden, um den Inhalt einer Datei in eine Datei zu lesen. In diesem Fall benötigen Sie jede Datei Datei, die nur eine Zeile enthält, mit nur dem Wert, den Sie für diese bestimmte Variable wünschen. Im obigen Beispiel würden Sie die Eingabedatei in eine mit dem Namen (z. B. name.in) und eine mit dem Alter (z. B. age.in) aufteilen und die Zeichen read name und ändern read age führt zu name=$(cat name.in) bzw. age=$(cat age.in).

7
Tomas Aschan

Ich habe hier eine funktionierende Lösung gefunden: https://af-design.com/2009/07/loading-data-into-bash-variables/

if [ -f $SETTINGS_FILE ];then
    . $SETTINGS_FILE
fi
3
Lukasz
name=$(<"$file") 

Ab man bash:1785 entspricht diese Befehlsersetzung name=$(cat "$file"), ist jedoch schneller.

3
hellork

Kurze Antwort:

name=`cat "$file"`
2
nedim
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


variableInFile () {
    variable=${1}
    file=${2}

    source ${file}
    eval value=\$\{${variable}\}
    echo ${value}
}


variableInFile ${@}

Ich benutze dies, um eine einzelne Variable aus einer Datei zu erhalten

GET_VAR=$(grep --color=never -Po "^${GET_VAR}=\K.*" "${FILE}" || true)

Wenn GET_VAR nicht in ${FILE} gefunden wird, ist es leer und verursacht dank || true keinen Fehler.

Es wird grep -P verwendet, das sich in GNU grep befindet, aber zum Zeitpunkt des Schreibens nicht in allen grep standardmäßig.

0
Eric Nemchik

Wenn Sie mehrere Zeichenfolgen verwenden möchten, können Sie Folgendes verwenden:

path="/foo/bar";
for p in `cat "$path"`;
do echo "$p" ....... (here you would pipe it where you need it) 

OR

Wenn Sie möchten, dass der Benutzer die Datei angibt

read -e "Specify path to variable(s): " path;
for p in 'cat "$path"';
do echo "$p" ............................
0
George