#! /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
这不会识别带有前导零的数字(但无论如何,所有算术运算都会将它们视为以 8 为基数的数字,除非您每次都小心地手动强制使用基数)。
如果您想要高于 20 个,一次匹配一个就不太好,而且您无法使用 匹配任意数字范围case
。在case
,10|99
中将完全匹配这两个字符串(not 12
, or 123
),并[0-9]
匹配单个数字,因此eg[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
如果你真的想给从零到一千的所有数字命名,你需要将问题分成几个部分(个、十、如何组合它们),并且最好使用函数来实现。