다음과 같이 정의된 비연관 배열이 있다고 가정합니다.
my_array=(foo bar baz)
배열에 주어진 문자열이 포함되어 있는지 확인하는 방법은 무엇입니까? 나는 블록의 조건 if
(예 if contains $my_array "something"; then ...
: )에서 사용할 수 있는 솔루션을 선호합니다.
답변1
array=(foo bar baz foo)
pattern=f*
value=foo
if (($array[(I)$pattern])); then
echo array contains at least one value that matches the pattern
fi
if (($array[(Ie)$value])); then
echo value is amongst the values of the array
fi
$array[(I)foo]
foo
in이 마지막으로 나타나는 인덱스를 반환 $array
하거나, 찾을 수 없으면 0을 반환합니다. 이 플래그는 패턴 일치가 아닌 정확한 일치임을 e
나타냅니다 .e
$value
속하는지 확인하려면단어익명 함수에 전달하고 함수 본문에서 찾을 수 있는 값 목록 $value
:$@
if ()(( $@[(Ie)$value] )) foo bar baz and some more; then
echo "It's one of those"
fi
값이 배열에 몇 번 나타나는지 확인하려면 ${A:*B}
연산자( A
array 에도 존재하는 배열의 요소 B
)를 사용할 수 있습니다.
array=(foo bar baz foo)
value=foo
search=("$value")
(){print -r $# occurrence${2+s} of $value in array} "${(@)array:*search}"
또는 배열 요소에 패턴 일치를 사용합니다.
(){print -r $# occurrence${2+s} of $value in array} "${(M@)array:#$value}"
답변2
배열이 있고 $my_array
배열에 문자열이 포함되어 있는지 알고 싶다면 foo
가능한 테스트 중 하나는 다음과 같습니다.
[[ ${my_array[(ie)foo]} -le ${#my_array} ]]
배열 요소의 전체 정확한 값은 이어야 합니다 foo
. 이는 하위 문자열 검사나 이와 유사한 것이 아닙니다.
$my_string
변수의 값이 배열에 있는지 확인하려면 다음을 사용하세요.
[[ ${my_array[(ie)$my_string]} -le ${#my_array} ]]
구문 (ie)
은 그다지 명확하지 않습니다. 그 설명은아래첨자 표시 부분ZSH 매뉴얼. 이 i
부분은 "역 첨자"를 사용하고 있음을 의미합니다. 평소처럼 첨자를 전달하고 값을 가져오는 대신 ${my_array[1]}
값을 전달하고 해당 값을 제공하는 첫 번째 첨자를 요청합니다. 아래 첨자는 숫자이며 1에서 시작합니다(배열의 첫 번째 요소는 인덱스 1에 있음). 이는 대부분의 프로그래밍 언어에서 사용되는 규칙과 다릅니다. in은 확장된 패턴 일치 문자 없이 정확한 일치를 원한다는 의미입니다 e
.(ie)
*
배열에서 값을 찾을 수 없으면 ${my_array[(ie)foo]
첫 번째 인덱스가 계산됩니다.결승선을 통과했습니다배열의 인덱스입니다. 따라서 요소가 3개인 배열의 경우 4를 반환합니다. ${#my_array}
배열의 마지막 요소에 대한 인덱스를 제공하므로 전자가 후자보다 작거나 같으면 주어진 값이 배열 어딘가에 존재합니다. 주어진 값이 다음과 같은지 확인하고 싶다면아니요그런 다음 배열에서 "보다 작거나 같음"을 "보다 큼"으로 변경합니다.
[[ ${my_array[(ie)foo]} -gt ${#my_array} ]]