GNU/Linux >> Linux Esercitazione >  >> Linux

bash + leggi variabili e valori dal file tramite lo script bash

Hai export worker01="sdg sdh sdi sdj sdk" , quindi sostituisci = con uno spazio per ottenere export worker01 "sdg sdh sdi sdj sdk" . I campi separati da spazio sono export , worker01 , "sdg , sdh , ecc.

Probabilmente è meglio dividere su = , e rimuovi le virgolette, quindi con solo la 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 contiene il nome della variabile, val il valore. Ovviamente questo in realtà non analizza l'input, rimuove solo le virgolette doppie se si trovano lì.


Con awk solo:

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

per ripeterlo puoi:

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

Se vuoi anche stampare il nome della variabile nel tuo ciclo puoi farlo:

#! /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

Uscita:

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

Innanzitutto, puoi ottenere i nomi delle variabili con questo comando GNU grep, usando una regex Perl-compat:

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

Quindi, puoi leggere l'output di ciò in un array bash con:

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

Questo usa l'integrato bash mapfile comando e una sostituzione di processo.

Infine, itera sui nomi delle variabili e usa indirect espansione del parametro per ottenere i valori:

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. Uno script Bash può essere agganciato a un file?

  2. Script Bash per rimuovere il file più vecchio da una cartella?

  3. Convogliare un elenco di valori in uno script Bash?

  4. Script Bash:pessimo interprete

  5. Esegue lo script bash dall'URL

Come leggere i file riga per riga in Bash

Come leggere un file riga per riga in Bash

35 Esempi di script Bash

Scripting Bash:come leggere i dati dai file di testo

Forzare bash a espandere le variabili in una stringa caricata da un file

Script Bash che mostra la modifica dei valori in tempo reale dai comandi