GNU/Linux >> LINUX-Kenntnisse >  >> Linux

bash + liest Variablen und Werte aus der Datei per Bash-Skript

Sie haben export worker01="sdg sdh sdi sdj sdk" , dann ersetzen Sie = mit einem Leerzeichen, um export worker01 "sdg sdh sdi sdj sdk" zu erhalten . Die durch Leerzeichen getrennten Felder darin sind export , worker01 , "sdg , sdh usw.

Es ist wahrscheinlich besser, auf = aufzuteilen , und entfernen Sie die Anführungszeichen, also nur mit der Shell:

$ while IFS== read -r key val ; do
    val=${val%\"}; val=${val#\"}; key=${key#export };
    echo "$key = $val";
  done < vars
worker01 = sdg sdh sdi sdj sdk
worker02 = sdg sdh sdi sdj sdm
worker03 = sdg sdh sdi sdj sdf

key enthält den Variablennamen val der Wert. Natürlich analysiert dies die Eingabe nicht wirklich, es entfernt nur die doppelten Anführungszeichen, falls sie zufällig vorhanden sind.


Mit awk allein:

awk -F'"' '{print $2}' file.txt
# To print the variable name as well:
awk '{gsub(/[:=]/," "); gsub(/[:"]/,""); if ($1 = "export") {$1=""; print $0}}' file.txt

Um es zu loopen, können Sie:

for i in "$(awk -F\" '{print $2}' file.txt)"; do
    var="$i"
    echo "$var"
done
my_array=($(awk -F\" '{print $2}' file.txt))
for element in "${my_var[@]}"; do
    another_var="$element"
    echo "$another_var"
done

Wenn Sie auch den Variablennamen in Ihrer Schleife ausgeben möchten, können Sie dies tun:

#! /usr/bin/env bash -
while read -r line; do
    if [[ "$(awk '{print $1}' <<<"$line")" == 'export' ]]; then
        var_name="$(awk '{print $2}' <<<"$line" | awk -F'=' '{print $1}')"
        var_value="$(awk -F\" '{print $2}' <<<"$line")"
        echo -e "${var_name}\n${var_value}"
    else
        continue
    fi
done<file.txt

Ausgabe:

$ ./script.sh
worker01
sdg sdh sdi sdj sdk
worker02
sdg sdh sdi sdj sdm
worker03
sdg sdh sdi sdj sdf

Erstens können Sie die Variablennamen mit diesem GNU-Grep-Befehl abrufen, indem Sie einen Perl-kompatiblen regulären Ausdruck verwenden:

grep -oP 'export \K[^=]+' file.txt

Dann können Sie die Ausgabe davon in ein Bash-Array einlesen mit:

mapfile -t variables < <(grep -oP 'export \K[^=]+' file.txt)

Das verwendet den in Bash eingebauten mapfile Befehl und eine Prozessersetzung.

Zuletzt iterieren Sie über die Variablennamen und verwenden Sie indirekt Parametererweiterung um die Werte zu erhalten:

for v in "${variables[@]}"; do 
    printf "varname=%s\tvalue=%s\n" "$v" "${!v}"
done
varname=worker01        value=sdg sdh sdi sdj sdk
varname=worker02        value=sdg sdh sdi sdj sdm
varname=worker03        value=sdg sdh sdi sdj sdf

Linux
  1. Leerzeichen für Variablen in Bash-Skript?

  2. Lesen von Zeilen aus einer Datei mit Bash:Für Vs. Während?

  3. Bash-Skript:schlechter Interpreter

  4. Zeile für Zeile im Bash-Skript lesen

  5. Führen Sie das Bash-Skript von der URL aus

So lesen Sie Dateien Zeile für Zeile in Bash

So lesen Sie eine Datei Zeile für Zeile in Bash

35 Bash-Skriptbeispiele

Bash-Scripting:So lesen Sie Daten aus Textdateien

Eine Werteliste an ein Bash-Skript weiterleiten?

Bash-Skript zum Entfernen der ältesten Datei aus einem Ordner