次のようなコードがあります。
while read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH; do
echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
done< <(ll | tail -n+2 | head -2)
(私は実際にls
/を使用していませんが、ll
この編集された例は私が経験しているのと同じ問題を示していると思います。)
問題は、失敗した場合に条件文が必要なため、ll | tail -n+2 | head -2
マッピングファイルを生成し、スクリプトを介してread
渡しました。地図ファイルが正しく作成されていますが、正しく読み取れるようにリダイレクトする方法がわかりません。
パスワード
if ! mapfile -t TEST_ARR < <(ll | tail -n+2 | head -2); then
exit 1
fi
while read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH; do
echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
done<<<"${TEST_ARR[@]}"
マップファイルの内容
declare -a TEST_ARR=(
[0]="drwxr-xr-x@ 38 wheel 1.2K Dec 7 07:10 ./"
[1]="drwxr-xr-x 33 wheel 1.0K Jan 18 07:05 ../"
)
出力
$ while read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH; do
> echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
> done<<<"${TEST_ARR[@]}"
drwxr-xr-x@
38
wheel
1.2K
Dec
7
この場合、文字列のリダイレクトは明らかに間違っていますが、配列をリダイレクトする方法がわかりません。
答え1
配列を繰り返しながら要素を列に読み込みたいと思います。
for ele in "${TEST_ARR[@]}"
do
read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH <<< "$ele"
echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
done
答え2
mapfile
ファイルの内容を配列として読み込み、割り当て"${array[@]}"
などのコンテキストで使用する場合、または単一の文字列のみを使用する場合は、<<<
すべての配列要素を単一の文字列に連結します。スペースで連結され、 の最初の文字で連結されることを"${array[*]}"
除けば、 と似ています。@
*
IFS
これで「マッピングファイルを作成する」と言われましたが、コマンド名をそのように解釈してはいけません。ファイルを配列に「マッピング」するのと似ています。 (一部の言語のように、双方向マップではなくコピーのみです。)代替名はreadarray
より正確である可能性があります。