Bash 배열 스크립트, 결합

Bash 배열 스크립트, 결합

현재 및 사용자 지정 디렉터리의 모든 파일 이름을 자동으로 읽는 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 ... )

단어 분할을 사용하여 출력을 요소로 분리할 수 있지만 여전히 괄호가 필요하며 IFSglobbing의 대상이 됩니다. 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

관련 정보