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