检查数组的内容

时间:2016-09-26 14:29:15

标签: arrays bash

我有一个这样的数组:

declare -A ignoreList='(
        [21]="1" 
        [22]="1"
        [25]="1" 
        [53]="1" 
        [80]="1" 
        [143]="1" 
        [587]="1" 
        [990]="1" 
        [993]="1" 
        [443]="1" 
        [2008]="1" 
        [10011]="1" 
        [30033]="1" 
        [41144]="1")'

现在我想检查数组ignoreList中的var $ SSH_PORT。

var $ SSH_PORT是这样的: SSH_PORT =" 443"

如果我试试这个:

if [[ -v ignoreList[$SSH_PORT] ]]; then
                    echo "$SSH_PORT is known"
                    exit 1
                else
                    echo "$SSH_PORT is not known"
                    exit 1
                fi

我在终端得到这个:

443 is not known

但是443号港口是众所周知的。

所以我试试 SSH_PORT =" 500" (未知)

并运行脚本:

500 is not known

他没有比较

如果我试试这个:

if [[ ${ignoreList[$SSH_PORT]} == 1 ]] ; then
echo In the list.

网络连接

它也没有用

我的Bash版本是4.3

〜#bash --version GNU bash,版本4.3.42(1)-release(x86_64-unknown-linux-gnu) 版权所有(C)2013 Free Software Foundation,Inc。 许可证GPLv3 +:GNU GPL版本3或更高版本http://gnu.org/licenses/gpl.html

这是免费软件;您可以自由更改并重新分发它。 在法律允许的范围内,不作任何担保。

2 个答案:

答案 0 :(得分:0)

对于关联数组。

if [[ ${ignoreList[$SSH_PORT]} == 1 ]] ; then
    echo In the list.
fi

对于数组:

found=0
for ignore in "${ignoreList2[@]}" ; do
    if [[ $ignore == $SSH_PORT ]] ; then
        found=1
        break
    fi
done
if (( found )) ; then
    echo In the list.
fi

测试脚本:

#!/bin/bash
declare -A ignoreList='(
        [21]="1" 
        [22]="1"
        [25]="1" 
        [53]="1" 
        [80]="1" 
        [143]="1" 
        [587]="1" 
        [990]="1" 
        [993]="1" 
        [443]="1" 
        [2008]="1" 
        [10011]="1" 
        [30033]="1" 
        [41144]="1")'

ignoreList2=(21 22 25 53 80 143 587 990 993 443 2008 10011 30033 41144)

for SSH_PORT in 22 23 ; do 
    echo $SSH_PORT
    if [[ ${ignoreList[$SSH_PORT]} == 1 ]] ; then
        echo In the list.
    else
        echo Not in the list.
    fi

    found=0
    for ignore in "${ignoreList2[@]}" ; do
        if [[ $ignore == $SSH_PORT ]] ; then
            found=1
            break
        fi
    done
    if (( found )) ; then
        echo In the list.
    else
        echo Not in the list.
    fi
done

答案 1 :(得分:0)

bash 4.3开始,您可以使用-v运算符。

$ [[ -v ignoreList[21] ]] && echo present
present
$ [[ -v ignoreList[23] ]] && echo present

如果值为SSH_PORT,则可以使用

if [[ -v ignoreList[$SSH_PORT] ]]; then
    echo "$SSH_PORT is known"
else
    echo "$SSH_PORT is not known"
fi