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