#! /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
。数字を単語に一度に1つずつマッピングするには、単一のケースを使用できます。
case "$number" in
0) echo Zero ;;
1) echo One ;;
# ...
9) echo Nine ;;
10) echo Ten ;;
11) echo Eleven ;;
esac
これは前にゼロの数字を認識しません(ただし、毎回手動で下を強制的に適用しない限り、すべての算術演算は8進数として扱います)。
20個以上が必要な場合は、一度に1つずつ一致させることはあまり良くなく、任意の範囲の数字と一致することはできません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、結合方法)に分割し、可能であれば関数を使用して実行する必要があります。