Saltar al contenido

bash + leer variables y valores del archivo mediante script bash

Esta es la contestación más completa que te podemos aportar, pero primero mírala pausadamente y valora si se puede adaptar a tu proyecto.

Solución:

Tú tienes export worker01="sdg sdh sdi sdj sdk"entonces reemplazas = con un espacio para conseguir export worker01 "sdg sdh sdi sdj sdk". Los campos separados por espacios en los que se export, worker01, "sdg, sdhetc.

Probablemente sea mejor dividir =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 hacer un bucle 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_namen$var_value"
    else
        continue
    fi
done

Producción:

$ ./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, puedes leer la salida de eso en un bash array 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 indirecto expansión de parámetros para obtener los valores:

for v in "$variables[@]"; do 
    printf "varname=%stvalue=%sn" "$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

Calificaciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *