Script de matriz bash, combinar

Script de matriz bash, combinar

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 IFSy globalización. declare -a aaa=( $(echo foo bar) )crea los dos elementos fooy bar. Tenga en cuenta que se divide en el espacio entre las palabras, no solo en las nuevas líneas.

Usar mapfile/ readarrayprobablemente 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 imagesen 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 imagesni 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

información relacionada