在 shell 脚本中的 while 循环内分配变量

在 shell 脚本中的 while 循环内分配变量

我试图在 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; }'

相关内容