Korn 쉘 스크립트의 조건부 정규식 패턴 일치

Korn 쉘 스크립트의 조건부 정규식 패턴 일치

저는 korn 쉘을 사용하여 Unix 쉘 스크립팅을 배우기 시작했습니다. 아래에 언급된 다음 문제에 대해 ksh 코드를 작성하는 동안 제가 저지른 실수를 찾을 수 있도록 알려주십시오.

내 스크립트에는 두 개의 매개변수가 있습니다. 인수가 숫자이면 합계를 내야 하고, 그렇지 않으면 그대로 인쇄해야 합니다. 내 코드는 다음과 같습니다.

#!/usr/bin/ksh

arg1=$1
arg2=$2

if echo $arg1 | grep  '^[0-9]+$' && echo $arg2 | grep '^[0-9]+$'
then
        echo ${expr $arg1 + $arg2}
else
    echo $arg1 and $arg2
fi

나는 올바른 출력을 얻으려고 여러 번 시도했지만 모두 헛된 것입니다. 항상 else 조건을 실행합니다. 스크립트를 실행하면:

sh var_regex_match.sh 40 50

내가 얻는 결과는 다음과 같습니다.

40 and 50

질문을 올리면서 실수가 있었다면 양해해 주시기 바랍니다. 도와주셔서 감사합니다!

답변1

  1. grep이 자동 grep으로 설정되어 있지 않습니다. 일치하는 항목이 있으면 출력되지만 사용자는 이를 원하지 않습니다. 따라서 일치하는 출력을 -q억제하는 옵션을 추가하십시오 grep.
  2. +확장 정규식(ERE)의 일부입니다. 활성화하려면 -Egrep 플래그가 필요합니다. 그렇지 않으면 +리터럴 문자로 처리되므로 초기 시도 40와 일치하지 않습니다.50
  3. 구문이 expr잘못되었습니다.

이러한 점을 수정하면 스크립트는 다음과 같습니다.

#!/usr/bin/ksh
arg1=$1
arg2=$2

if echo "$arg1" | grep -Eq '^[0-9]+$' && echo "$arg2" | grep -Eq '^[0-9]+$'
then
    expr "$arg1" + "$arg2"
else
    echo "$arg1 and $arg2"
fi

그러나 이 방법은 많은 우회가 필요하므로 expr더 이상 사용되지 않습니다. 보다 직접적인 방법은

#!/usr/bin/ksh
arg1=$1
arg2=$2

case "$arg1$arg2" in
    *[!0-9]*) echo "$arg1 and $arg2";;
    *) echo "$((arg1+arg2))";;
esac

연결된 합계에 case숫자가 아닌 숫자가 포함되어 있는지 확인합니다. 그렇다면 에코되어 변경됩니다. 그렇지 않으면 합계를 계산하십시오.$arg1$arg2

관련 정보