zsh 배열에 주어진 값이 포함되어 있는지 확인하는 방법은 무엇입니까?

zsh 배열에 주어진 값이 포함되어 있는지 확인하는 방법은 무엇입니까?

다음과 같이 정의된 비연관 배열이 있다고 가정합니다.

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]fooin이 마지막으로 나타나는 인덱스를 반환 $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}연산자( Aarray 에도 존재하는 배열의 요소 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} ]]

관련 정보