あなたは export worker01="sdg sdh sdi sdj sdk"
を持っています 、次に =
を置き換えます export worker01 "sdg sdh sdi sdj sdk"
を取得するためのスペース付き .スペースで区切られたフィールドは export
です 、 worker01
、 "sdg
、 sdh
など
=
で分割したほうがよいでしょう。 、引用符を削除して、シェルだけで:
$ 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