GNU/Linux >> Tutoriales Linux >  >> Linux

bash + leer variables y valores del archivo mediante script bash

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

Linux
  1. ¿Se puede conectar un script Bash a un archivo?

  2. Bash Script para eliminar el archivo más antiguo de una carpeta?

  3. ¿Espacios para variables en Bash Script?

  4. Bash script:mal intérprete

  5. Leer línea por línea en bash script

Cómo leer archivos línea por línea en Bash

Cómo leer un archivo línea por línea en Bash

35 ejemplos de secuencias de comandos Bash

Bash scripting:cómo leer datos de archivos de texto

archivo de creación atómica si no existe desde el script bash

Bash script para eliminar el archivo más antiguo de una carpeta