#! /bin/bash
number=$1
if [ $number -gt 9 -o $number -lt 100 ]
then
if [ $number -eq 10 ]
then
echo Ten
exit
elif [ $number -eq 11 ]
then
echo Eleven
else
echo Thirteen
fi
fi
이것은 내 코드이지만 입력 값이 10 일 경우에만 인쇄되며 다른 값과 함께 11을 입력하면 11이 표시되지 않습니다. 그 이유를 알고 계십니까?
----------수정됨
number=$1
output=""
if [ $number -lt 0 -a $number -gt 999 ]
then
echo put the right input between 0 and 999
fi
case "$number"
in
[0-9])
if [ $number -eq 0 ]
then
echo Zero
elif [ $number -eq 1 ]
then
echo One
elif [ $number -eq 2 ]
then
echo Two
elif [ $number -eq 3 ]
then
echo Three
elif [ $number -eq 4 ]
then
echo Four
elif [ $number -eq 5 ]
then
echo Five
elif [ $number -eq 6 ]
then
echo Six
elif [ $number -eq 7 ]
then
echo Seven
elif [ $number -eq 8 ]
then
echo Eight
elif [ $number -eq 9 ]
then
echo Nine
fi
;;
10|99)
if [ $number -gt 9 -a $number -lt 100 ]
then
if [ $number -eq 10 ]
then
echo Ten
elif [ $number -eq 11 ]
then
echo Eleven
else
echo Thirteen
fi
fi
;;
100|999)
if [ $number -gt 99 -a $number -lt 1000 ]
then
echo Two
fi
;;
esac
여기서 (10|99) 역시 10 이외의 값은 표시하지 않습니다.
답변1
조건이 다음과 같으므로 숫자에 대해서는 항상 참입니다.또는:
if [ $number -gt 9 -o $number -lt 100 ]
첫 번째 스크립트는 다른 모든 값을 인식 Ten
하고 Eleven
인쇄합니다 .Thirteen
조건이 다음과 같으므로 이는 항상 거짓입니다.그리고:
if [ $number -lt 0 -a $number -gt 999 ]
case
왜 나머지 부분을 a 및 s로 구성했는지 모르겠습니다 if
. 숫자를 단어에 한 번에 하나씩 매핑하려면 단일 사례를 사용하면 됩니다.
case "$number" in
0) echo Zero ;;
1) echo One ;;
# ...
9) echo Nine ;;
10) echo Ten ;;
11) echo Eleven ;;
esac
이것은 앞에 0이 있는 숫자를 인식하지 못합니다(그러나 매번 수동으로 밑을 강제로 적용하지 않는 한 모든 산술 연산은 이를 8진 숫자로 처리합니다).
20개 이상을 원하는 경우 한 번에 하나씩 일치시키는 것은 그리 좋지 않으며 어떤 범위의 숫자와도 일치를 사용할 수 없습니다 case
. 에서는 두 문자열 모두 정확하게 일치하고( not , or ) 단일 숫자와 일치하므로 예 를 case
들어 는 와 같습니다 . 따라서 더 나을 수도 있습니다.10|99
12
123
[0-9]
[0-100]
[01]
if
if [[ $number -ge 20 -a $number -lt 30 ]]; then
echo Twenty-something
elif [[ $number -ge 20 -a $number -lt 30 ]]; then
echo Thirty-something
fi
어떤 값(예: )의 문제로 여기에서 또는 [[ .. -a .. ]]
를 사용해야 합니다 . 만약 너라면[ .. ] && [ .. ]
[ .. -a .. ]
"!"
하다대신 [ .. ]
참조 변수를 사용하십시오 .[ "$number" -lt 123 ]
[ $number -lt 123 ]
하지만 이 방법은 작동하지만 특정 숫자 위치를 일치시킬 수 있는 경우에만 가능합니다.
case $number in
2?) echo Twenty-something ;;
3?) echo Thirty-something ;;
esac
0부터 1000까지 모든 숫자의 이름을 지정하려면 문제를 여러 부분(1, 10, 결합 방법)으로 나누고 가급적이면 함수를 사용하여 수행해야 합니다.