現在のディレクトリとカスタムディレクトリのすべてのファイル名を自動的に読み込み、新しく作成された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 ... )
トークン化を使用して出力を要素に分割できますが、まだ括弧が必要で、ワイルドカードが適用されますIFS
。declare -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.