BASHスクリプト:コマンド出力の各行を配列の値に割り当てる方法は?

BASHスクリプト:コマンド出力の各行を配列の値に割り当てる方法は?

コマンドを実行すると、10行の出力が表示されます。 2-4-6-8-10行を配列に入れたいです。

コマンドを実行するたびに順序が変わるため、一度に行う必要があります。コマンドを実行して2行目を選択し、もう一度実行して4行目を選択するなどの方法を試しましたが、順序が変更されたため機能しません。

value1=$(my_command |sed '2q;d')
value2=$(my_command |sed '4q;d')
value3=$(my_command |sed '6q;d')
value4=$(my_command |sed '8q;d')
value5=$(my_command |sed '10q;d')

MY_ARRAY=("${value1}" "${value2}" "${value3}" "${value4}" "${value5}")

答え1

readarraybashシェルとGNUで使用sed

readarray -t my_array < <( my_command | sed '1~2d' )

組み込み関数はreadarray行を配列に読み込みます。この行はプロセス置換で読み込まれます。プロセス置換コマンドは、読み取った(または書かれているか標準的に)sed1行ずつフィルタリングしてのみ出力します。my_commandsed '1!n;d'sed -n 'n;p'sed

GNUでは、このアドレスはsedlineで始まる各行をn~m指定します。便宜上、これは標準のGNU拡張です。mnsed

このmy_commandコマンドは一度だけ呼び出されます。

テスト:

$ readarray -t my_array < <( seq 10 | sed '1~2d' )
$ printf '%s\n' "${my_array[@]}"
2
4
6
8
10

関連情報