GNU/Linux >> Linux の 問題 >  >> Linux

bash + bashスクリプトでファイルから変数と値を読み取る

あなたは export worker01="sdg sdh sdi sdj sdk" を持っています 、次に = を置き換えます export worker01 "sdg sdh sdi sdj sdk" を取得するためのスペース付き .スペースで区切られたフィールドは export です 、 worker01"sdgsdh など

= で分割したほうがよいでしょう。 、引用符を削除して、シェルだけで:

$ 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 変数名 val を含む 値。もちろん、これは実際に入力を解析するのではなく、二重引用符が存在する場合にそれらを削除するだけです。


awk で 一人で:

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

ループするには:

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

ループ内で変数名も出力したい場合は、次のようにすることができます:

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

出力:

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

まず、Perl 互換の正規表現を使用して、この GNU grep コマンドで変数名を取得できます。

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

次に、その出力を bash 配列に読み込むことができます:

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

これは、bash 組み込みの mapfile を使用します コマンドとプロセスの置換。

最後に、変数名を反復処理し、indirect を使用します 値を取得するためのパラメータ展開:

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スクリプトが同時に実行されないようにする

  2. Bashスクリプトをファイルに接続できますか?

  3. フォルダから最も古いファイルを削除するためのBashスクリプト?

  1. Bashスクリプト:ファイルがテキストファイルかどうかを確認しますか?

  2. Bash スクリプト:不適切なインタープリター

  3. Bashスクリプトで1行ずつ読む

  1. URLからbashスクリプトを実行

  2. Bash シェル スクリプト内から Vim を開く

  3. ファイルからロードされた文字列の変数をbashに展開させる