Bash: 정수 표현식이 필요하며 읽기/테스트를 사용합니다.

Bash: 정수 표현식이 필요하며 읽기/테스트를 사용합니다.

저는 쉘 프로그래밍의 기초를 배우고 있어서 다음과 같은 간단한 것을 작성했습니다.

#!/bin/bash
read var1
read var2
if [ var1 -lt var2 ]; then
    echo "var1 is lt var2"
else
    echo "var2 is lt var1"
fi

내 이해는 Bash에서 변수의 유형이 지정되지 않았으며 숫자만 포함된 모든 변수는 정수로 사용될 수 있다는 것입니다. 하지만 이것을 실행하면 "예상 정수 표현식"이라는 오류가 발생합니다. 왜 그럴까요?

답변1

declare실제로 (또는 이전) 내장 함수를 사용하여 변수에 일부 속성을 설정할 수 있습니다 typeset. declare -i var1 var2정수 속성은 이러한 변수에 설정됩니다. 이후에 이러한 변수에 정수가 아닌 값을 할당하려고 시도하면 오류가 발생합니다.

하지만 문제는 구문에 있습니다. 변수 값을 사용할 때는 해당 이름 앞에 다음을 붙여야 합니다 $.

if [ "$var1" -lt "$var2" ]; then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

산술 평가는 예외이며 다음이 필요하지 않습니다 $.

if ((var1<var2)); then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

경고로서, 단어 확장으로 인해 표현식 구문이 엉망이 되는 것을 방지하려면 변수를 항상 [.. 안에 ]큰따옴표로 묶으십시오 . (즉, IFS설정되지 않은 변수, 빈 문자열이 포함된 변수, 문자가 포함된 변수에 문제가 있다는 의미입니다 .) 또는 더 새롭고 더 나은 [[...을 사용하여 ]]이러한 경우를 올바르게 처리할 수 있습니다.

if [[ $var1 -lt $var2 ]]; then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

답변2

이름 앞에 변수를 인용해야 합니다.$

if [ $var1 -lt $var2 ] ; then...

관련 정보