while 루프 내에서 변수를 할당하려고 하는데 읽기 문 중에 스크립트가 중단됩니다.
while read -r port 60720 60721 60722 60723 60724
코드는 다음과 같습니다.
qmgrs=$($MQ_INSTALL_PATH/bin/dspmq | grep QMNAME | awk -F\( '{ print $2}'| awk -F\) '{ print $1}')
numqmgrs=$($MQ_INSTALL_PATH/bin/dspmq | grep QMNAME | wc -l)
strqmgrs=(${qmgrs})
i=$numqmgrs
arrayindex=0
while ((i != 0))
do
while read -r port 60720 60721 60722 60723 60724 ;do
qmgrname=${strqmgrs[$arrayindex]}
echo "
this is the $port for the $qmgrname”
i=$((i-1))
arrayindex=$((arrayindex+1))
done
done
원하는 출력:
this is the 60720 for the apple”
this is the 60721 for the pear”
this is the 60722 for the mango”
this is the 60723 for the grape”
this is the 60724 for the blueberry”
답변1
명령에서 얻은 서버 이름과 포트 번호의 정적 목록을 연결하려는 것 같습니다.
대신 이렇게 하세요:
PATH=$MQ_INSTALL_PATH/bin:$PATH
ports=( 60720 60721 60722 60723 60724 )
i=0
dspmq | sed -n '/QMNAME/{ s/.*(\([^)]*\)).*/\1/p; }' |
while read -r server && [ "$i" -lt "${#ports[@]}" ]; do
printf 'Port on %s is %d\n' "$server" "${ports[i]}"
i=$(( i+1 ))
done
이는 본질적으로 원하는 작업이지만 조건이 결합된 단일 루프 대신 두 개의 중첩 루프를 사용합니다. 또한 코드는 서버 이름을 중간 배열에 저장하지 않고 생성하는 명령 파이프라인에서 직접 읽습니다.
포트 번호를 역순으로 배포하려면 다음을 사용하십시오.
PATH=$MQ_INSTALL_PATH/bin:$PATH
ports=( 60720 60721 60722 60723 60724 )
i=${#ports[@]}
dspmq | sed -n '/QMNAME/{ s/.*(\([^)]*\)).*/\1/p; }' |
while read -r server && [ "$i" -gt 0 ]; do
i=$(( i-1 ))
printf 'Port on %s is %d\n' "$server" "${ports[i]}"
done
위의 모든 경우에 표현식은 ${#ports[@]}
배열의 요소 수로 확장됩니다 ports
.
sed
명령
sed -n '/QMNAME/{ s/.*(\([^)]*\)).*/\1/p; }'
문자열이 포함된 줄의 첫 번째 대괄호 안에 있는 문자열이 추출됩니다 QMNAME
. 다음과 같이 쓸 수도 있습니다.
sed -n '/QMNAME/{ s/.*(//; s/).*//p; }'