
Estoy intentando escribir un script bash, que leerá automáticamente todos los nombres de archivos en los directorios actuales y personalizados, luego aplicará los nombres de las nuevas imágenes acoplables creadas a los archivos yml encontrados a través de kubectl, luego leerá los nombres de las imágenes de dos matrices y los nombres completos del registro:
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
Ambas matrices tienen la misma cantidad de índices. Mi bucle debería tomar los primeros índices de IMG_NAME y colocarlos en comandos kubectl para cada índice de matriz. Por ahora se está tomando toda la gama....
Respuesta1
declare -a IMG_ARRAY=`...`
Esto no crea una gran matriz, toda la salida de la sustitución del comando se asigna al elemento cero de la matriz. La sintaxis real de asignación de matrices es , es decir, con paréntesis y los elementos como palabras distintas.name=(elem1 elem2 ... )
Podrías usar la división de palabras para separar la salida en elementos, pero eso aún requiere los pares, y estás sujeto a IFS
y globalización. declare -a aaa=( $(echo foo bar) )
crea los dos elementos foo
y bar
. Tenga en cuenta que se divide en el espacio entre las palabras, no solo en las nuevas líneas.
Usar mapfile
/ readarray
probablemente sea mejor aquí, ya que está hecho explícitamente para leer líneas en una matriz. El texto de ayuda de la línea de comando ( help mapfile
) describe esto:
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.
Respuesta2
Tengo entendido que desea tener la salida procesada docker images
en dos matrices donde cada elemento de la matriz corresponda a una línea de la salida procesada.
Este script no está probado porque no conozco el resultado docker images
ni la sintaxis del comando kubectl
.
mapfile -t IMG_ARRAY < <(docker images | awk '/dev2/ && /latest/' | awk '{print $1}' | sed ':a;N;$!ba;s/\n/ /g')
mapfile -t IMG_NAME < <(docker images | awk '/dev2/ && /latest/' | awk '{print $1}' | awk -F'/' '{print $3}' | cut -f1 -d"." | sed ':a;N;$!ba;s/\n/ /g')
total=${#IMG_NAME[*]}
for (( i=0; i<$(( $total )); i++ ))
do
kubectl set image deployment/$IMG_NAME[$i] $IMG_NAME[$i]=$IMG_ARRAY[$i] --record
kubectl rollout status deployment/$IMG_NAME[i]
done
Verhttps://www.cyberciti.biz/faq/bash-iterate-array/yhttps://mywiki.wooledge.org/BashFAQ/005para explicaciones.
En lugar de
total=${#IMG_NAME[*]}
for (( i=0; i<$(( $total )); i++ ))
también puedes usar
for i in ${!IMG_NAME[@]}
verhttps://stackoverflow.com/questions/6723426/looping-over-arrays-printing-both-index-and-value