Bash는 동시에 여러 변수를 처리합니다.

Bash는 동시에 여러 변수를 처리합니다.

다음과 같이 여러 변수를 동시에 처리할 수 있는 방법이 있는지 궁금합니다.

#/bin/bash
arr1=(1 2)
arr2=(3 4)
foo=1
bar=2

case $foo && $bar in
    ${arr1[@]})
        echo "variables equal array 1!";;
    ${arr2[@]})
        echo "variables equal array 2!";;
    *)
        echo "variables do not exactly equal any array!";;
esac

$foo합계 $bar자체를 배열에 넣고 싶지는 않지만 꼭 필요한 경우에는 그렇게 할 수 있습니다.

답변1

IFS기본값이 변경되지 않았다고 가정합니다 .

case "$foo $bar" in
"${arr1[*]}") echo "variables equal array 1!" ;;
"${arr2[*]}") echo "variables equal array 2!" ;;
*) echo "variables do not exactly equal any array!" ;;
esac

이는 각 배열에 저장된 개별 값에 구분 기호(공백)가 없는 경우에만 신뢰할 수 있습니다.

답변2

첫째, 배열 변수에 대해 걱정하지 않습니다.

둘째, 변수에 표시되지 않는 한 원하는 구분 기호를 사용할 수 있습니다. 저는 "/"를 많이 사용합니다.

그것은 다음과 같습니다:

case "$foo"/"$bar" in
(1/2) echo variables equal to first pattern\! ;;
(3/4) echo variables equal to second pattern\! ;;
(*) echo variables match no pattern. ;;
esac

또한 다음과 같은 와일드카드 항목을 상당히 쉽게 작성할 수 있습니다.

(1??/2??) echo variables are similar to the first pattern, but bigger\! ;;

패턴의 순서가 중요하며(첫 번째 일치 항목이 승리) 값에 구분 기호가 표시되지 않기를 원한다는 점을 기억하세요.

또한 첫 번째 패턴을 생성하는 경우 (*/*/*)값에 구분 기호가 나타나는지 테스트할 수 있습니다.

답변3

typeset -p배열 동등 비교의 출력을 비교할 수 있습니다.

case $(a=("$foo" "$bar"); typeset -p a) in
  ("$(a=("${arr1[@]}"); typeset -p a)") ...;;
  ("$(a=("${arr2[@]}"); typeset -p a)") ...;;
esac

를 사용하면 uoting을 적용한 후 요소를 추가하여 배열의 결정적 문자열 표현을 생성할 zsh수 있으며, 그런 다음 하위 쉘에서 실행하지 않고도 문자열로 비교할 수 있습니다.jqtypeset -p

case "${(q)foo} ${(q)bar}" in
  (${(j[ ])${(q)arr1}}) ...;;
  (${(j[ ])${(q)arr2}}) ...;;
esac

관련 정보