GNU/Linux >> Znalost Linux >  >> Linux

bash + čtení proměnných a hodnot ze souboru pomocí bash skriptu

Máte export worker01="sdg sdh sdi sdj sdk" , pak nahradíte = s mezerou pro získání export worker01 "sdg sdh sdi sdj sdk" . Pole oddělená mezerami jsou export , worker01 , "sdg , sdh , atd.

Pravděpodobně je lepší rozdělit na = a odstraňte uvozovky, takže pouze pomocí shellu:

$ 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 obsahuje název proměnné val hodnota. Samozřejmě to ve skutečnosti neanalyzuje vstup, pouze odstraní dvojité uvozovky, pokud tam náhodou jsou.


Pomocí awk sám:

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

pro opakování můžete:

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

Pokud chcete také vytisknout název proměnné ve vaší smyčce, můžete to udělat takto:

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

Výstup:

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

Nejprve můžete získat názvy proměnných pomocí tohoto příkazu GNU grep pomocí regulárního výrazu Perl-compat:

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

Poté můžete načíst jeho výstup do pole bash pomocí:

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

To používá vestavěný bash mapfile příkaz a substituce procesu.

Nakonec iterujte názvy proměnných a použijte nepřímé rozšíření parametru pro získání hodnot:

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. Čtení řádků ze souboru s Bash:For vs. Zatímco?

  2. Bash skript:špatný interpret

  3. Čtěte řádek po řádku v bash skriptu

  1. Otevřete Vim ze skriptu prostředí Bash

  2. atomic create soubor, pokud neexistuje z bash skriptu

  3. Bash skript pro odstranění nejstaršího souboru ze složky

  1. Zabránění souběžnému spuštění bash skriptu

  2. Může být Bash skript připojen k souboru?

  3. Bash skript, který ukazuje měnící se hodnoty v reálném čase z příkazů