次のファイル変数と値があります
# more file.txt
export worker01="sdg sdh sdi sdj sdk"
export worker02="sdg sdh sdi sdj sdm"
export worker03="sdg sdh sdi sdj sdf"
変数を読み取るためにソースを実行します。
# source file.txt
例:
echo $worker01
sdg sdh sdi sdj sdk
これまですべてが完璧です。
しかし、今私はファイルから変数を読み、単純なbashループを介して値を印刷したいと思います。 2番目のフィールドを読み、変数の値を印刷してみましょう。
# for i in ` sed s'/=/ /g' /tmp/file.txt | awk '{print $2}' `
do
echo $i
declare var="$i"
echo $var
done
ただし、値は印刷せず、変数のみを印刷します。
worker01
worker01
worker02
worker02
worker03
worker03
予想出力:
worker01
sdg sdh sdi sdj sdk
worker02
sdg sdh sdi sdj sdm
worker03
sdg sdh sdi sdj sdf
答え1
がある場合は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
値を含みます。もちろん、これは実際に入力を解析するのではなく、二重引用符がある場合はそれを削除するだけです。
答え2
そしてアッホロ:
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
答え3
まず、Perl準拠の正規表現を使用して、GNU grepコマンドで変数名を取得できます。
grep -oP 'export \K[^=]+' file.txt
次に、次を使用して出力を bash 配列として読み取ることができます.
mapfile -t variables < <(grep -oP 'export \K[^=]+' file.txt)
Bash 組み込み機能の使用mapfile
コマンドとプロセスの交換。
最後に変数名を繰り返し、次のようにします。間接的なパラメータ拡張価値を得る:
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
答え4
このsedを使用できます
sed -E 's/[^ ]* ([^=]*)="([^"]*)"/\1\n\2/' file.txt
それともこれはちょっと変です。
awk -F '"|=' '{split($1,a," ");print a[2]"\n"$3}' file.txt