if문을 if문으로 변환

if문을 if문으로 변환

현재 성능 향상을 위해 스크립트 변경 사항을 테스트하고 있습니다. 특히 진술 if로 변경하고 싶습니다 case.

그러나 쉘 프로그래밍이 처음이기 때문에 다음과 같은 유형의 선언이 필요합니다.

if [ "$A" == "x" -a "$B" == "y" ] 
    then
        let a=a+1
fi 

나는 성공하지 않고 이것을 시도했습니다.

case "$A$B" in
    "x""y") let a=a+1
;;
esac

내가 뭘 잘못했나요?

Case 문에서 "!="를 관리할 수 있나요? 예를 들어:

if [ "$A" == "x" -a "$B" != "y" ] 
then
    let a=a+1
fi 

답변1

귀하의 case예는 저에게 효과적이었지만 비교하고 있다는 점에 유의하십시오.종속and A이므로 is 와 are 비어 있으면 B패턴도 일치합니다. (가운데 큰따옴표는 중복인 것 같아요.) 딱 하나만요AxyBcase단어패턴과 비교하므로 연결을 제외하고는 여러 변수를 비교할 수 없습니다.

표준 test또는 [명령에서 비교 연산자는 입니다 =. ==일부 시스템에서는 작동하지만 전부는 아닙니다. 게다가, -a적어도 다음과 같은 조건에서는 -n결합 된 조건을 사용하는 것이 문제가 됩니다. (바라보다이 문제). 를 사용하는 것이 더 좋습니다 if [ "$A" = x ] && [ "$B" = y ] ; then ....

a를 뒤집는 경우 case대상 문자열을 제외한 모든 항목과 일치하는 패턴을 만들어야 합니다.extglob큰 타격을 입은 상태에서Other는 다음을 제외한 모든 일치를 허용합니다.

case $B in !(y) ) echo not y ;; esac

이것이 없으면 패턴을 뒤집기 위해 더 많은 작업을 수행하거나 여러 패턴을 사용해야 합니다. 먼저 문자열과 일치하고 나중에 기본 일치가 실제 작업을 수행합니다.

case $B in ??*) echo not y ;; [^y]) echo also not y ;; esac

case $B in y) ;; *) echo still not y ;; esac

(특히 첫 번째 보장은 없습니다. 솔직히 이 작업을 수행한다는 전체 아이디어는 끔찍해 보입니다.)

어쨌든 성능상의 이유를 언급하셨으니 단순한 비교 때문이 아니라 외부 프로그램(예: 등,grep,sedcutjq

답변2

#  $A = "x" && $B = "y"
case ${A:--}/${B:--} in 'x/y' ) let a=a+1;; esac

# $A = "x" && $B != "y"
case $A in 'x' ) case $B in '' | ??* | [!y] ) let a=a+1;; esac;; esac

관련 정보