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