배열에서 인덱스 또는 키를 확인하는 가장 쉬운 방법은 무엇입니까?
사용 :
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"
예를 들어 '51'이 이미 설정되어 있는지 빠르게 확인하는 방법은 무엇입니까?
3) 연관 배열을 다루는 방법은 무엇입니까?
declare -A myArray
myArray["key1"]="red"
myArray["key2"]="black"
myArray["key3"]="blue"
예를 들어 'key2'가 이미 사용되었는지 빠르게 확인하는 방법은 무엇입니까?
감사
편집 됨
가장 간단한 방법은 나에게 보입니다.
if test "${myArray['key_or_index']+isset}"
then
echo "yes"
else
echo "no"
fi;
이것은 인덱스 배열과 연관 배열 모두에서 작동합니다. set -o 명사 설정시 오류가 표시되지 않습니다.
헤드 업을 위해 doubleDown에게 감사드립니다.
요소가 설정되었는지 확인하려면 (인덱싱 된 배열과 연관 배열 모두에 적용됨)
[ ${array[key]+abc} ] && echo "exists"
기본적으로하는 ${array[key]+abc}
것은
- 경우
array[key]
설정, 반환abc
array[key]
설정되지 않은 경우 아무것도 반환하지 않습니다.
참조 :
참조 매개 변수 확장 배쉬 설명서와 작은 노트
콜론이 생략되면 연산자는 [ 매개 변수 ]의 존재 여부 만 테스트합니다 .
이 답변은 실제로이 질문에 대한 답변에서 수정 되었습니다. bash 쉘 스크립트에 문자열이 정의되어 있지 않은지 어떻게 알 수 있습니까?
래퍼 기능 :
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
에서 남자 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 [bar]와 foo [baz]가 모두 설정되어 있고 (후자는 빈 값으로 설정되어 있어도) foo [quux]가 설정되지 않았 음을 보여줍니다.
불행히도 bash는 비어있는 변수 와 정의되지 않은 변수 사이에 차이를 만들 수 없습니다 .
그러나 몇 가지 방법이 있습니다.
$ 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
외부 도구없이 작업을 수행 할 수 있으며 ( 순수 bash 로서 printf | grep 없음 ), 새로운 bash 함수로 checkIfExist () 를 빌드 하십시오 .
$ 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
bash 4.3.39 (1) 릴리스에서 테스트 됨
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
이것이 내가 스크립트에서 찾은 가장 쉬운 방법입니다.
<search>
찾으려는 문자열, ASSOC_ARRAY
연관 배열을 보유하는 변수의 이름입니다.
달성하고자하는 것에 따라 :
키가 있습니다 .
if grep -qe "<search>" <(echo "${!ASSOC_ARRAY[@]}"); then echo key is present; fi
key exists not:
if ! grep -qe "<search>" <(echo "${!ASSOC_ARRAY[@]}"); then echo key not present; fi
value exists:
if grep -qe "<search>" <(echo "${ASSOC_ARRAY[@]}"); then echo value is present; fi
value exists not:
if ! grep -qe "<search>" <(echo "${ASSOC_ARRAY[@]}"); then echo value not present; fi
I wrote a function to check if a key exists in an array in Bash:
# 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
}
Example
declare -A my_array
my_array['foo']="bar"
if [[ "$(array_key_exists 'my_array' 'foo'; echo $?)" = "0" ]]; then
echo "OK"
else
echo "ERROR"
fi
Tested with GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
What about a -z
test and the :-
operator?
For example, this script:
#!/usr/bin/env bash
set -e
set -u
declare -A sample
sample["ABC"]=2
sample["DEF"]=3
if [[ ! -z "${sample['ABC']:-}" ]]; then
echo "ABC is set"
fi
if [[ ! -z "${sample['DEF']:-}" ]]; then
echo "DEF is set"
fi
if [[ ! -z "${sample['GHI']:-}" ]]; then
echo "GHI is set"
fi
Prints:
ABC is set
DEF is set
참고URL : https://stackoverflow.com/questions/13219634/easiest-way-to-check-for-an-index-or-a-key-in-an-array
'development' 카테고리의 다른 글
JSON 배열 (예 : [1,2,3])을 ''유형으로 역 직렬화 할 수 없습니다. 올바른 역 직렬화를 위해서는 JSON 개체 (예 : {“name”:“value”})가 필요하기 때문입니다. (0) | 2020.10.21 |
---|---|
Grails vs Roo-SpringSource가 두 가지 매우 유사한 기술을 추진하는 이유는 무엇입니까? (0) | 2020.10.21 |
모든 실행 전에 주제에서 모든 데이터를 삭제하거나 주제를 삭제하는 방법이 있습니까? (0) | 2020.10.21 |
Visual Studio ASP.Net MVC 실행 취소가 시작 페이지 작업으로 설정 됨 (0) | 2020.10.21 |
monit 디버깅 (0) | 2020.10.21 |