shell脚本练习题 下载本文

内容发布更新时间 : 2024/4/28 23:18:02星期一 下面是文章的全部内容请认真阅读。

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