注:各ファイルに1行ずつ1つの単語が含まれている場合、これは簡単です。
ソースファイルでスペースを使用したい場合は、別の区切り文字を使用できます。
while IFS=@ read -r aws_user_name aws_key aws_account_num ;do
printf "User: %-16s Key: %-22s AccNum: %s\n" \
"$aws_user_name" "$aws_key" "$aws_account_num"
# ....
done < <(
paste -d@ "$aws_users_all" "$aws_env_list" "$aws_account_numbers"
)
IFS=@
paste -d@
それがどういう意味なのかよくわかりませんか?私はそれを理解paste -d "|,"
し、IFS = ";"が何を意味するのかを理解することもできます。私もフォローするhttps://stackoverflow.com/questions/7427262/how-to-read-a-file-into-a-variable-in-shell
https://man7.org/linux/man-pages/man1/bash.1.html
答え1
FWIW、答えよりもコメントに近いです。@roaima提供)、次のように書く方が合理的です。
while
IFS= read -r aws_user_name <&3 &&
IFS= read -r aws_key <&4 &&
IFS= read -r aws_account_num <&5
do
printf "User: %-16s Key: %-22s AccNum: %s\n" \
"$aws_user_name" "$aws_key" "$aws_account_num"
# ....
done 3< "$aws_users_all" 4< "$aws_env_list" 5< "$aws_account_numbers"
@
後で参加し、分割する代わりに@
。
この方法で@
in値を持つことは問題を引き起こさず、3つのリストの欠落要素が正しく検出されます。また、<(...)
kshismを防ぎ、標準コードにしますsh
。
awk
ループが何をするのかがすべて印刷されている場合は、そのようなperl
ループ内のいくつかの不正なツールを複数回呼び出すよりも、適切なテキスト処理ユーティリティを使用する方が合理的です。詳しくは以下をご覧ください。シェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?
答え2
これで理解したので、フィールドを区別する代わりにpaste -d "|,"
意味を推論することもできます。paste -d@
これは同じプロセスです。 (多くのUNIX / Linuxツールと同様に、フラグとその引数はスペースで連結または区切ることができます。標準の構文解析ライブラリは関係ありません。|,
@
POSIXユーティリティ引数の構文、ポイント2a。 )
この場合、IFS
変数は動詞が入力を解析する方法を決定しますread
。変数aws_user_name
、aws_key
およびはaws_account_num
出力から読み取られ、追加されたばかりpaste -d@
のシンボルで分割されます。@
paste
コマンドを部分的に分析して、何が起こっているのかを確認できます。paste
コマンドを実行すると(3つの変数に適切なファイル名を使用)、while read …
ループが処理する内容が表示されます。
paste -d@ "$aws_users_all" "$aws_env_list" "$aws_account_numbers"
@
ソース値に区切り文字()が含まれていると、この処理は中止されます。