Tienes export worker01="sdg sdh sdi sdj sdk"
, luego reemplazas =
con un espacio para obtener export worker01 "sdg sdh sdi sdj sdk"
. Los campos separados por espacios son export
, worker01
, "sdg
, sdh
, etc.
Probablemente sea mejor dividir en =
, y elimine las comillas, así que solo con el 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 el nombre de la variable, val
el valor. Por supuesto, esto en realidad no analiza la entrada, simplemente elimina las comillas dobles si están allí.
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
para repetirlo puedes:
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
Si también desea imprimir el nombre de la variable en su ciclo, puede hacer esto:
#! /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
Salida:
$ ./script.sh
worker01
sdg sdh sdi sdj sdk
worker02
sdg sdh sdi sdj sdm
worker03
sdg sdh sdi sdj sdf
Primero, puede obtener los nombres de las variables con este comando GNU grep, usando una expresión regular compatible con Perl:
grep -oP 'export \K[^=]+' file.txt
Luego, puede leer la salida de eso en una matriz bash con:
mapfile -t variables < <(grep -oP 'export \K[^=]+' file.txt)
Eso usa el bash incorporado mapfile
comando y una sustitución de proceso.
Por último, itere sobre los nombres de las variables y use indirect expansión de parámetros para obtener los valores:
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