GNU/Linux >> Tutoriels Linux >  >> Linux

bash + lire les variables et les valeurs du fichier par le script bash

Vous avez export worker01="sdg sdh sdi sdj sdk" , puis vous remplacez = avec un espace pour obtenir export worker01 "sdg sdh sdi sdj sdk" . Les champs séparés par des espaces qui sont export , worker01 , "sdg , sdh , etc.

Il est probablement préférable de diviser en = , et supprimez les guillemets, donc avec juste le 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 contient le nom de la variable, val la valeur. Bien sûr, cela n'analyse pas réellement l'entrée, cela supprime simplement les guillemets doubles s'ils s'y trouvent.


Avec awk seul :

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

pour le boucler, vous pouvez :

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 vous souhaitez également imprimer le nom de la variable dans votre boucle, vous pouvez le faire :

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

Sortie :

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

Tout d'abord, vous pouvez obtenir les noms des variables avec cette commande GNU grep, en utilisant une regex compatible Perl :

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

Ensuite, vous pouvez lire la sortie de cela dans un tableau bash avec :

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

Qui utilise le bash intégré mapfile commande et une substitution de processus.

Enfin, parcourez les noms de variables et utilisez indirect expansion des paramètres pour obtenir les valeurs :

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. Un script Bash peut-il être accroché à un fichier ?

  2. Script Bash :vérifier si un fichier est un fichier texte ?

  3. Canaliser une liste de valeurs vers un script bash ?

  4. Lecture de lignes à partir d'un fichier avec Bash :pour Vs. Tandis que?

  5. Exécuter le script bash à partir de l'URL

Comment lire des fichiers ligne par ligne dans Bash

Comment lire un fichier ligne par ligne dans Bash

35 exemples de scripts bash

Script bash :comment lire des données à partir de fichiers texte

Script bash pour supprimer le fichier le plus ancien d'un dossier

Script bash qui montre la modification des valeurs en temps réel à partir des commandes