检查索引或阵列中的一个关键最简单的方法?(Easiest way to check for an i

2019-07-03 13:21发布

使用:

set -o nounset

1)具有索引数组,如:

myArray=( "red" "black" "blue" )

这是检查元素1设置最短的路?
我有时会使用以下命令:

test "${#myArray[@]}" -gt "1" && echo "1 exists" || echo "1 doesn't exist"

我想知道,如果有一个首选之一。

2)如何处理非连续的索引?

myArray=()
myArray[12]="red"
myArray[51]="black"
myArray[129]="blue"

如何快速检查“五一”已被设置为例子吗?

3)如何处理关联数组?

declare -A myArray
myArray["key1"]="red"
myArray["key2"]="black"
myArray["key3"]="blue"

如何快速检查“键2”已用于例子吗?

谢谢

EDITED
最简单的方法似乎对我说:

if test "${myArray['key_or_index']+isset}"
    then
        echo "yes"
    else
        echo "no"
fi;

这既适用于索引和关联数组。 与集-o nounset出任何错误。
由于doubleDown的平视。

Answer 1:

要检查是否元件被设置(同时适用于索引和关联数组)

[ ${array[key]+abc} ] && echo "exists"

基本上什么${array[key]+abc}确实是

  • 如果array[key]被设定,则返回abc
  • 如果array[key]没有设置,返回任何结果


参考文献:

  1. 参见参数扩展 Bash的手册和小纸条

    如果结肠被省略,操作者仅测试生存[ 参数 ]

  2. :这个答案实际上是从回答这个问题SO适应如何判断一个字符串是不是在bash shell脚本定义 ?


包装函数:

exists(){
  if [ "$2" != in ]; then
    echo "Incorrect usage."
    echo "Correct usage: exists {key} in {array}"
    return
  fi   
  eval '[ ${'$3'[$1]+muahaha} ]'  
}

例如

if ! exists key in array; then echo "No such array element"; fi 


Answer 2:

从人的bash ,条件表达式:

-v varname
              True if the shell variable varname is set (has been assigned a value).

例:

declare -A foo
foo[bar]="this is bar"
foo[baz]=""
if [[ -v "foo[bar]" ]] ; then
  echo "foo[bar] is set"
fi
if [[ -v "foo[baz]" ]] ; then
  echo "foo[baz] is set"
fi
if [[ -v "foo[quux]" ]] ; then
  echo "foo[quux] is set"
fi

这将表明,这两种FOO [巴]和Foo [巴兹]被设置(即使后者被设置为空值)和Foo [QUUX]不是。



Answer 3:

不幸的是,庆典给没有办法让悫空的不确定的变量差异。

但有一些方法:

$ array=()
$ array[12]="red"
$ array[51]="black"
$ array[129]="blue"

$ echo ${array[@]}
red black blue

$ echo ${!array[@]}
12 51 129

$ echo "${#array[@]}"
3

$ printf "%s\n" ${!array[@]}|grep -q ^51$ && echo 51 exist
51 exist

$ printf "%s\n" ${!array[@]}|grep -q ^52$ && echo 52 exist

(给没有回答)

而对于关联数组,你可以使用相同的:

$ unset array
$ declare -A array
$ array["key1"]="red"
$ array["key2"]="black"
$ array["key3"]="blue"
$ echo ${array[@]}
blue black red

$ echo ${!array[@]}
key3 key2 key1

$ echo ${#array[@]}
3

$ set | grep ^array=
array=([key3]="blue" [key2]="black" [key1]="red" )

$ printf "%s\n" ${!array[@]}|grep -q ^key2$ && echo key2 exist || echo key2 not exist
key2 exist

$ printf "%s\n" ${!array[@]}|grep -q ^key5$ && echo key5 exist || echo key5 not exist
key5 not exist

你可以做的工作,而不需要的外部工具(没有的printf | grep的纯bash)的 ,以及为什么不建checkIfExist()作为一个新的bash功能:

$ checkIfExist() {
    eval 'local keys=${!'$1'[@]}';
    eval "case '$2' in
        ${keys// /|}) return 0 ;;
        * ) return 1 ;;
      esac";
}

$ checkIfExist array key2 && echo exist || echo don\'t
exist

$ checkIfExist array key5 && echo exist || echo don\'t
don't

甚至创造一个新的getIfExist bash函数返回所需的值,并退出与假的结果码如果不存在所需的值:

$ getIfExist() {
    eval 'local keys=${!'$1'[@]}';
    eval "case '$2' in
        ${keys// /|}) echo \${$1[$2]};return 0 ;;
        * ) return 1 ;;
      esac";
}

$ getIfExist array key1
red
$ echo $?
0

$ # now with an empty defined value
$ array["key4"]=""
$ getIfExist array key4

$ echo $?
0
$ getIfExist array key5
$ echo $?
1


Answer 4:

在bash 39年3月4日(1)-release测试

declare -A fmap
fmap['foo']="boo"

key='foo'
# should echo foo is set to 'boo'
if [[ -z "${fmap[${key}]}" ]]; then echo "$key is unset in fmap"; else echo "${key} is set to '${fmap[${key}]}'"; fi
key='blah'
# should echo blah is unset in fmap
if [[ -z "${fmap[${key}]}" ]]; then echo "$key is unset in fmap"; else echo "${key} is set to '${fmap[${key}]}'"; fi


Answer 5:

这是我发现的脚本最简单的方法。

<search>是您要查找的字符串, ASSOC_ARRAY变量牵着你的关联数组的名称。

Dependign你想要达到的目标:

项是否存在

if grep -qe "<search>" <(echo "${!ASSOC_ARRAY[@]}"); then echo key is present; fi

关键不存在

if ! grep -qe "<search>" <(echo "${!ASSOC_ARRAY[@]}"); then echo key not present; fi

值存在

if grep -qe "<search>" <(echo "${ASSOC_ARRAY[@]}"); then echo value is present; fi

值不存在

if ! grep -qe "<search>" <(echo "${ASSOC_ARRAY[@]}"); then echo value not present; fi


Answer 6:

我写了一个函数来检查的关键在猛砸数组存在:

# Check if array key exists
# Usage: array_key_exists $array_name $key
# Returns: 0 = key exists, 1 = key does NOT exist
function array_key_exists() {
    local _array_name="$1"
    local _key="$2"
    local _cmd='echo ${!'$_array_name'[@]}'
    local _array_keys=($(eval $_cmd))
    local _key_exists=$(echo " ${_array_keys[@]} " | grep " $_key " &>/dev/null; echo $?)
    [[ "$_key_exists" = "0" ]] && return 0 || return 1
}

declare -A my_array
my_array['foo']="bar"

if [[ "$(array_key_exists 'my_array' 'foo'; echo $?)" = "0" ]]; then
    echo "OK"
else
    echo "ERROR"
fi

与GNU的bash,版本4.1.5进行测试(1)-release(1486-PC-Linux的GNU)



文章来源: Easiest way to check for an index or a key in an array?