
현재 및 사용자 지정 디렉터리의 모든 파일 이름을 자동으로 읽는 bash 스크립트를 작성하려고 합니다. 그런 다음 새로 생성된 도커 이미지 이름을 kubectl을 통해 찾은 yml 파일에 적용한 다음 두 배열 이미지 이름과 전체 레지스트리 이름에서 읽습니다.
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
globbing의 대상이 됩니다. declare -a aaa=( $(echo foo bar) )
두 개의 요소를 생성 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.
답변2
docker images
내 이해는 모든 배열 요소가 처리된 출력의 한 줄에 해당하는 두 개의 배열에서 처리된 출력을 원한다는 것입니다 .
나는 의 출력도 모르고 docker images
의 명령 구문도 모르기 때문에 이 스크립트는 테스트되지 않았습니다 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
보다https://www.cyberciti.biz/faq/bash-iterate-array/그리고https://mywiki.wooledge.org/BashFAQ/005설명을 위해.
대신에
total=${#IMG_NAME[*]}
for (( i=0; i<$(( $total )); i++ ))
당신은 또한 사용할 수 있습니다
for i in ${!IMG_NAME[@]}
보다https://stackoverflow.com/questions/6723426/looping-over-arrays-printing-both-index-and-value