直到item在bash中的数组中不存在

时间:2016-07-29 10:49:49

标签: arrays bash

我有部分代码

jmsPort=61015
jmsPorts=(61018 61016 61017)

until [ $jmsPorts -ne $jmsPort ]; do    
    jmsPort=$(expr $jmsPort + 1)
done

在这种情况下,循环的迭代只有一次,如何使用它 直到jmsPorts数组不包含jmsPort do(jmsPort + 1)

我想实现的目标是

如果jmsPort匹配数组中的元素: 它应该对jmsPort执行+1操作,直到jmsPort与jmsPorts数组中的元素不匹配

如果jmsPort不在数组中: 它应该选择jmsPort

我使用PowerShell完成了此操作,但无法在Bash中执行此操作。 PowerShell中的语法是

$jmsPort = 61016
$jmsPorts = @(61018, 61016, 61017)

do
{
    $jmsPort = $jmsPort + 1
} 
until ($jmsPorts -notcontains $jmsPort )

1 个答案:

答案 0 :(得分:2)

请记住

jmsPorts=() # jmsPorts is an array

要更新数组,最初(在编辑之前)你已经

jmsPorts+=$(echo $i | grep -oP '\d+') # Wrong

应该

jmsPorts+=( "$(echo $i | grep -oP '\d+')" ) #mind the outer brackets.

现在检查jmsPort是否与jmsPorts数组中的任何元素匹配

validator(){
flag=0 # Assuming the element is not present
for i in "${jmsPorts[@]}"
do
 if [ "$1" -eq "$i" ]
 then
  flag=1 # Element is present
 fi
done
}
while validator "$jmsPort" && [ "$flag" -eq 1 ]
do
((jmsPort++))
done

echo "Port Chosen : $jmsPort"  
# This port doesn't match any value in the array.

警告:端口1-65535可用,1-1023范围内的端口是特权端口。在更复杂的场景中,可能需要额外检查[ $jmsPort -lt 65535 ]。功能