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.
KEY=VALUE
Paare? Die Lösungen sind ganz anders (wenn es die letztere ist, gilt die Antwort von Takkat, die ehemalige Radu)Antworten:
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
Diese Variable können wir dann mit importieren
quelle
<filename>
sich in Ihrer Shell befindet, in Ihrer Shell ausgeführt wird, z. B.rm -rf /
, was sehr gefährlich sein kann.sed
hinzufügenlocal
und das Skript ein bisschen sicherer machen, ohne Ihren globalen Geltungsbereich zu gefährden. Also drinnen eine Funktion machencat global_variables.sh | sed -e 's/^/local /' > local_variables.sh
und dann benutzen. ./local_variables.sh
. Was auch immer Sie in die Funktion importieren, ist nur in dieser Funktion verfügbar. Beachten Sie, dass davon ausgegangen wird, dassglobal_variables.sh
nur eine Variable pro Zeile enthalten ist.Angenommen, Sie möchten, dass der gesamte Inhalt Ihrer Textdatei in Ihrer Variablen gespeichert wird, können Sie Folgendes verwenden:
Oder in reiner Bash:
quelle
echo $name
. Ich benutze es nur zum Testen. Als nächstes können Sie die$name
Variable zur weiteren Verarbeitung an einer beliebigen Stelle in Ihrem Skript verwenden.$name
Variablen ist die Zeichenfolge aus Ihrer Datei, die mit demcat $file
Befehl zugewiesen wurde . Was ist nicht klar oder so schwer zu verstehen?$file
Variable zu verwenden, wenn Sie sie nur einmal zum Laden der$name
Variablen verwenden. Verwenden Sie einfachcat /path/to/file
In Ihrem Skript können Sie dies tun:
Sie können dies sogar mehrmals tun, z. B. in einer Schleife
quelle
Eine Alternative dazu wäre, 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 (aufgerufen
script.sh
)und die Eingabedatei (aufgerufen
input.in
)Sie können dies auf zwei Arten vom Terminal aus ausführen:
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ădeanu hat bereits vorgeschlagen , könnten Sie
cat
in Ihrem Skript den Inhalt einer Datei in ein avariable zu lesen - in diesem Fall Sie jede Datei benötigen nur eine Zeile enthalten, nur mit dem Wert , den Sie für diese bestimmte Variable wollen. Im obigen Beispiel würden Sie die Eingabedatei in eine mit dem Namen (sagen wir, geteiltname.in
) und eine mit dem Alter ( zum Beispielage.in
), und die ändernread name
undread age
Zeilenname=$(cat name.in)
undage=$(cat age.in)
jeweils.quelle
vh=$(awk "NR==3 {print;exit}" /var/www/test.txt)
. Anschließend wird die Zeichenfolge in einer Variablen gespeichert$vh
, sodass Sie sie folgendermaßen verwenden können:mkdir "/var/www/$vh"
- Dadurch wird ein Ordner mit dem angegebenen Namen in / var / www erstellt.Ich habe hier eine funktionierende Lösung gefunden: https://af-design.com/2009/07/07/loading-data-into-bash-variables/
quelle
Ab entspricht
man bash:1785
diese Befehlsersetzungname=$(cat "$file")
jedoch einer schnelleren.quelle
Kurze Antwort:
quelle
Wenn Sie mehrere Zeichenfolgen verwenden möchten, können Sie Folgendes verwenden:
ODER
Wenn Sie möchten, dass der Benutzer die Datei angibt
quelle
quelle
Ich benutze dies, um eine einzelne Variable aus einer Datei zu erhalten
Wenn
GET_VAR
es nicht gefunden${FILE}
wird, ist es leer, anstatt einen Fehler zu verursachen|| true
.Es wird verwendet,
grep -P
was sich zum Zeitpunkt des Schreibens in GNU grep befindet, aber nicht standardmäßig in all grep.quelle