Bash配列スクリプト、組み合わせ

Bash配列スクリプト、組み合わせ

現在のディレクトリとカスタムディレクトリのすべてのファイル名を自動的に読み込み、新しく作成されたdockerイメージ名をkubectlを介して見つかったymlファイルに適用し、両方の配列からイメージ名を読み取るbashスクリプトを作成しようとしています。完全なレジストリ名:

declare -a IMG_ARRAY=`docker images | awk '/dev2/ && /latest/' | awk '{print $1}' | sed ':a;N;$!ba;s/\n/ /g'`
declare -a IMG_NAME=`docker images | awk '/dev2/ && /latest/' | awk '{print $1}' | awk -F'/' '{print $3}' | cut -f1 -d"." | sed ':a;N;$!ba;s/\n/ /g'`

IFS=' ' read -r -a array <<< "$IMG_NAME"
for element in "${array[@]}"
  do
     kubectl set image deployment/$IMG_NAME $IMG_NAME=$IMG_ARRAY --record
     kubectl rollout status deployment/$IMG_NAME
done

どちらの配列も同じ数のインデックスを持ちます。私のループはIMG_NAMEから最初のインデックスを取得し、各配列インデックスをkubectlコマンドに入れることになっています。現在、全体の配列を占めています。

ベストアンサー1

declare -a IMG_ARRAY=`...`

これにより、配列があまり生成されず、コマンド置換のすべての出力が配列の要素0に割り当てられます。実際の配列割り当て構文は、つまり、括弧と要素を別々の単語として使用することです。name=(elem1 elem2 ... )

トークン化を使用して出力を要素に分割できますが、まだ括弧が必要で、ワイルドカードが適用されますIFSdeclare -a aaa=( $(echo foo bar) )2つの要素を生成fooしますbar。改行文字だけでなく、単語間のスペースに基づいて分割されることに注意してください。

行を配列として読み取るために明示的に使用されるので、ここでmapfile/を使用する方が良いでしょう。readarrayコマンドラインヘルプテキスト(help mapfile)はこれについて説明しています。

mapfile: mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
    Read lines from the standard input into an indexed array variable.

    Read lines from the standard input into the indexed array variable ARRAY, or
    from file descriptor FD if the -u option is supplied.  The variable MAPFILE
    is the default ARRAY.

おすすめ記事