remainder=$((thousand00)) while [ ${#remainder} –lt 3 ];do
#${#remainder} # 避免remainder
为remainder串的长度
remainder=0$remainder 为00x时的丢0情况。
done
thousand=$(($thousand/1000))
#以下四句可用一句表示:result=‖${TD:=”,”}$remainder$result‖ # 上面蓝色部分表:若TD非空则返回TD,否则将”,”赋给TD.
if [ –z $TD ] ; then # 判断用户是否自定义整数分隔符, 若 空
TD=, fi result=‖$TD$remainder$result‖ 顺序
done
# 与分隔符合成串。 注意
}
if [ –n $thousand ]; then # 若 非空
result=‖$thousand$result‖
elif [ ${result%${result#?}} = ―$TD‖ ]; then result=‖${result#?}‖ fi
echo $result
脚本标志参数处理命令: getopts ―‖ var 带两个参数,第一个参数为带解析的 参数标志序列串(如-f,-c等), 以冒号(:)分隔各标志,且以冒号:结束
第二个参数为:变量,每执行一次存放 参数标志序列串中的一个标志字符 返回值:未解析结束返回0,解析结束返回1
涉及的内定变量:$OPTARG 每次解析标志对应的参数值 便默认存放在此变量内。
$OPTIND 当各标志处理无误情况下,该数值指示当前用到的最大位置参数($#)。
此值使用容易出错(若参数的判断不完善时), 还不如用 $#
另外 $1, $2, $3, $4, ===> 此时 $# 等于 4, 当执行shift 1 时, 各个位置参数的值向一次向左右1次,此时 $1的值 为原$2的值
当执行shift 2 时, 各个位置参数的值向一次向左右2次,此时 $1的值 为原$3的值。
完整代码 ------- nicenumber.sh --------------------------- nicenumber()
..... # 函数实现部分
#处理脚本标志参数
while getopts ―d:t:‖ opt do
case $opt in # $opt 为 具体的标志字符 d ) DD=‖$OPTARG‖ ;; # $OPTARG 为标志指定的参数值 t ) TD=‖$OPTARG‖ ;; * ) echo ―no arg-flag: $opt‖ >&2 ; exit 1 esac done
# 当脚本接收如此多的参数时,$1将不代表脚本最终要处理的大数字,所以做如下操作。
shift $(($OPTIND - 1))
nicenumber $1 exit 0
----------------------------------------------------------------
扩展:
1.不同国家整数与小数的分隔符不同,使脚本能够处理各种整数与小数各种分隔符情况。在传给脚本参数时需指定标志-d
程序中仅需在 分隔 整数与小数部分略修改为
integer=$(echo $1 | cut ―–d${DD:=‖.‖‖ –f1 ) decimal=$(echo $1 | cut ―–d$DD‖ –f2 )
2.另外,可以在程序执行之前分别初始化DD,TD默认值。
3. 检测传给脚本的大数值中是否含有 非法的整小数分隔符,即存在与用户指定或默认分隔符不同的符号。
方法:删除其中所有数字,看剩下的内容,若不空且不等于$DD,则非法 separator=‖$(echo $1 | sed ?s/[[:digit:]]//g‘)‖
if [ -n $separator && ―$separator‖ != ―$DD‖ ];then # 蓝色部分可用 –a 表示 exit 1 fi
5. 检测 输入整数的合法性,可负数(-1, -2均合法), 可以指定传入整数范围,不在范围内则报错。
参数:1或3个, 当3个时,后两个为范围。 合法性:正负数的判断,范围的判断。 validint() {
integer=$1 min=$2 max=$3 # 判断传参的合法性,以下判断是错误的,因为不管参数是否为空,实际上都传了三个参数。
if [ $# -eq 0 ];then # 改成判断$1的内容是否为空,就可以了
echo ―you couldn‘t do nothing>‖&2 return 1 fi #判断是否为负数,第一个字符 是否为 –, 如是,则判断后面的是否为整数。若非负,则判断是否为整数
if [ ―$(echo $1 | cut –c1)‖ = ―-‖ ]; then signed=‖-‖
integer=‖${integer#?}‖ fi
# 如果就是一个符号 -,则也是非法的 if [ -z ―$integer‖ ]; then
echo ―Invalid input, just a ―-‖ is not allowed‖>&2 #注意:>&2 三个字符紧连。 return 1 fi
# 如果非纯数字构成,则非法。
if [ -n ―$(echo $integer | sed ?s/[[:digit:]]//g‘)‖ ] ; then echo ―Invalid integer, it includes some char but digit‖>&2 return 1 fi
integer=‖$signed$integer‖
# 范围判断,注意当 min 和 max 为空时(即未传范围),我设定其为$integer,如此判断就不会出错。
if [ $integer –lt ${min:=$ingeger} ];then echo ―$integer is too small, it should greater than $min‖>&2 return 1 fi
if [ $integer –gt ${max:=$integer} ];then echo ―$integer is too large, it should little than $max‖>&2 return 1 fi
return 0
}
--------------执行代码------------ #!/bin/bash validint() .....#
if validint ―$1‖ ―$2‖ ―$3‖; then
echo ―your input is valide‖
fi
注:if [ ! -z $min -a \为AND表达式,但在shall脚本中,当第一个条件为false时,不能保证第二个条件不被测。 而将if条件改写成两层嵌套的if语句后,当第一个为false时,则第二个一个不会被测。
6. 检测浮点数的合法性。 参数:1个浮点数
合法性: 不支持科学表示法,支持带符号 -1.2 -.75均合法。
思路:首先要判断是整数还是浮点数,只是一种可能性的判断,即判断有没有 点
有点的情况:依据“.”劈成两半,前半为合法整数。后半必须为 >=0 的整数。
需调用上一例中的判断整数合法性的validint()函数
无点的情况:基本做整数判断处理 函数:
validfloat() {
fvalue=$1
# 保证传入参数非空
if [ -z ―$fvalue‖ ] ; then
echo ―you input nothing‖>&2 return 1 fi
# 判断有点否?(清除点以外的字符,看看结果是否为空)
if [ -n $(echo $fvalue | sed ?s/[^.]//g‘) ] ; then integer=‖$(echo $fvalue | cut –d. f1 )‖ decimal=‖$(echo $fvalue | cut –d. f2 )‖
//判断整数部分的合法性,当仅为 – 时,把它看成0,免去判断 if [ ―$integer‖ != ―-‖ ] ; then if ! validint ―$integer‖ ; then
echo ―part before dot $integer is not valide!‖>&2 return 1 fi fi
//判断小数部分整数的合法性。必须>=0, 当为空时不判断。 if [ -n ―$decimal‖ ] ; then
if ! validint ―$decimal‖ 0 ; then
echo ―part after dot $decimal is not valide!‖>&2 return 1 fi fi else
# 没有点,就当作整数处理
if validint ―fvalue‖ ; then
echo ―your input is a integer‖>&2 return 1 fi fi