저는 쉘 프로그래밍의 기초를 배우고 있어서 다음과 같은 간단한 것을 작성했습니다.
#!/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...