shell脚本练习题

default

========================================================================

2.写一个脚本,检测用户输入串的合法性, 要求串由大小写字母、数字组成,无标点、特殊符号、空格。

思路:将输入的串中 非字母数字的内容删除或替换为空后若和原来输入的相同则合法,否则不合法。 isvalidAlphaNum() { }

注: 1.关于引用变量时是否需要双引号的说明 如果只是输出,可以不用双引号

如果变量值代的内容中无空格,表达,特殊符号,在引用时可以不需要双引号,反之,最好带双引号,否则在变量处理时很有可

能会出现“参数过多”等莫名其妙的错误信息。

2.关于匹配处理,sed是单行编辑程序。 sed ?s/str1/str2/g‘ file 将文件file中每行内str1替换为str2

[[:alnum:]]表示所有字母和数字中的任一个字符。若只是[:alnum:]则表示 方括号中的任一个字符。

[^[:alnum:]] 表除了所有字母数字外的任一字符。

如果是直接向脚本传字符串,则带空格的字串会被脚本自行分解为多个参数,所以可采用从标准输入读取的方式获得字串。

============== 完善程序代码 =====================================

compressed=‖$(echo $1 | sed 's/[^[:alnum:]]//g')‖ #替换不合要求字符为空 if [ ―$compressed‖ != ―$1‖ ] ; then fi

return 1

# not valide

else

return 0 # valide

#!/bin/bash

isvalidAlphaNum()

...

#函数体,判断字串的合法性

# -n 强制不换行

#读取内容存到input中, 无 $ 符号

echo -n ―Enter input:‖ read input

if ! isvalidAlphaNum ―&input‖ ; then #加引号,否则可能会出错。 echo ―invalide‖ exit 1 else

echo ―valide‖ fi

exit 0

===============================================================

3.输入一个 “month day year”格式的日期串,程序将处理‖ month‖为 其英文单词的前三个字母,第一个字母大写,其余的小写。

思路:首先判断month是数字、还是单词,若是数字,则可查“数字—month”映射表(自定义case结构);若是单词,则取前三个字母,并格式化。 函数monthnoToName() 将month数字转换为month名 monthnoToName() {

case $1 in

1 ) month=\ 3 ) month=\ 5 ) month=\ 7 ) month=\ 9 ) month=\ 11) month=\

* ) echo \; exit 1 # default, esac # return 0 }

假设通过传三个参数到脚本——month day year

---------- 实现代码 ------------------------------ #!/bin/bash

if [ $# -ne 3 ] ; then 误

echo ―Usage: $0 month day year‖ exit 1 fi

#若参数个数不为3,则有

#判断参数1是数字还是单词,方法 替换串中所有数字,若结果为空,则为数字,否则为单词。

if [ -n $(echo $1 | sed ?s/[[:digit:]]//g‘) ] # -n 检测串是为空 then

monthnoToName $1 else

# 数字

# 取第一个字母并将其变为大写,再将结果与取出的第二三字母组合

month=‖$(echo $1 | cut –c1 | tr '[:lower:]' '[:upper:]')―

month=‖$month$(echo $1 | cut -c2-3 | tr '[:upper:]' '[:lower:]')‖ fi

echo $month $2 $3 # 输出结果 exit 0

-------------------------------------------------

注:1.外围可以使用函数中定义的变量,如函数monthnoToName中定义的month变量,最后echo会用到它。

2. 多管道(|)的使用

3. month变量的合并, $var$var

4. tr SET1 SET2 转换/删除/替换 命令, 将默认 将SET1 替换为 SET2 tr 默认从标准输入读取,处理后 写入 标准输出。 5. cut –c2-3 file 取文件每行第2,3字母。

扩展: 处理MM/DD/YYYY or MM-DD-YYYY 的形式。在判断三个参数前执行命令

set -- $(echo $1 | sed 's/[\\/\\-]/ /g') 。set 的 –- 命令可以将其后的参数赋予 位置参数($1,$2,...) 链接 set 指令 用法

。 4. 格式化输出 大数字,使输出结果更容易让人知道该输出数字的数量级。

默认用逗号分隔整数部分,用点号分隔整数与小数部分,当然用户也可以使用 –d 指定整数的分隔符,用-t指定

整数与小数部分的分隔符。

算法: 1232342142.423023 ==> 默认:1,232,342,142.423023 (1)首先分开整数部分integer 和小数部分decimal, sed –d. -f1 和 sed –d. -f2 分别取两部分。 (2)整数部分的处理:

当作数字来处理 %运算 /运算

1)每次取整数低三位,长度小于3就补前缀0(避免出现漏0情况,例如低三位为003时,取后便为值3)

2)将此次得到的三位与上一次得到的三位用分隔符(如果没有指定就默认)组合起来。

3)整数去掉低三位,继续操作1)。当此整数小于等于999就不再继续。 当字串来处理:

1)每次取低三位, cut –c $((${#str} - 2))-${#str} ${#str} 为str的长度,必须为大括号。

$(( )) 的内部为str长度-2,代表倒数低三个字符。因为内部是减法,所有此为双小括号。

2)原串每次都要裁掉尾部三个字符,每次取到的字串的长度为循环判断条件。

函数 nicenumber()作如上处理

nicenumber() # 传入 integer.decimal 如2000023.2, 32232332等

{

# 分别取 整数部分和小数部分

integer=$(echo $1 | cut –d. –f1) decimal=$(echo $1 ! cut –d. –f2)

# 判断小数部分是否存在,因为这涉及连接整数和小数的连接符问题 # 设DD 为 整数和小数之间分隔符,默认为 .

if [ –n $decimal ] ; then #若非空,即有小数部分。 #以下四句可用一句表示:result=‖${DD:=”.”}$remainder$result‖ if [ -z $DD ]; then #判断用户是否自定义整数与分隔符,若空

DD=. fi result=$DD$decimal # 在小数部分前加 分隔符。

fi

thousand=$integer

while [ thousand –gt 999 ] do

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4