GNU/Linux >> Belajar Linux >  >> Linux

bash + baca variabel &nilai dari file dengan skrip bash

Anda memiliki export worker01="sdg sdh sdi sdj sdk" , lalu anda ganti = dengan spasi untuk mendapatkan export worker01 "sdg sdh sdi sdj sdk" . Kolom yang dipisahkan spasi adalah export , worker01 , "sdg , sdh , dll.

Mungkin lebih baik membagi pada = , dan hapus tanda kutip, jadi hanya dengan 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 berisi nama variabel, val nilai. Tentu saja ini tidak benar-benar mengurai input, ini hanya menghapus tanda kutip ganda jika ada di sana.


Dengan awk sendirian:

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

untuk memutarnya Anda dapat:

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

Jika Anda juga ingin mencetak nama variabel di loop Anda, Anda dapat melakukan ini:

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

Keluaran:

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

Pertama, Anda bisa mendapatkan nama variabel dengan perintah grep GNU ini, menggunakan regex Perl-compat:

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

Kemudian, Anda dapat membaca hasilnya ke dalam bash array dengan:

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

Itu menggunakan bash builtin mapfile perintah dan substitusi proses.

Terakhir, ulangi nama variabel dan gunakan tidak langsung perluasan parameter untuk mendapatkan nilai:

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. Bash Script Untuk Menghapus File Terlama Dari Folder A?

  2. Spasi Untuk Variabel Dalam Skrip Bash?

  3. Membaca Baris Dari File Dengan Bash:Untuk Vs. Ketika?

  1. Skrip Bash:juru bahasa yang buruk

  2. Baca baris demi baris dalam skrip bash

  3. Buka Vim dari dalam skrip Bash Shell

  1. Mencegah skrip bash berjalan secara bersamaan

  2. Bisakah Skrip Bash Dihubungkan ke File?

  3. atom buat file jika tidak ada dari skrip bash