shell 编程(2)
1. (1)将主提示符改为用户的主目录名 (提示:参考教材 4.6.8 节环境变量 PS1 和 HOME 的用法)
(2)将字符串 DOS file c:>\$student\*赋值给变量 x,并显示出来 (提示:注意引号的选择,同时确保字符串中多个空格、$、*等完全原样显示)
(3)在 shell 命令终端输入 likes=(cosmos galaxy moon); likes[6]=mars,然后使用 echo 分别显示以下表达式 的值,并结合结果,写出表达式的作用。
① ${likes[*]} ② ${likes[@]} ③ ${#likes[*]} ④ ${#likes[@]} ⑤ ${#likes} ⑥ ${#likes[0]}
① ${likes[*]} 数组likes中非空的值
② ${likes[@]} 同上
③ ${#likes[*]} 数组likes中已经设置了的个数
④ ${#likes[@]} 同上
⑤ ${#likes} 数组likes中第一个元素“mars”的长度
⑥ ${#likes[0]} 同上
(4)在 shell命令终端输入name=Phoenix,然后使用echo显示表达式①,观察结果;然后输入命令unset name, 再输入表达式①观察结果。结合两次结果,写出表达式的作用。 ① ${name:-hello}
当name不为空时使用变量:-字符串赋值无效。
而unset删除name后其中为空,所以赋值“hello”
(5)在 shell命令终端输入name='/usr/share/doc/apg/php.tar.gz',然后使用echo分别显示表达式①和②的值, 观察结果。 修改 name 的值,让 name='/etc/apt/sources.list.d',再次使用 echo 分别显示表达式①和②的值,观察结果。 结合结果,写出表达式的作用。 ① ${name%%.*} ② ${name%.*}
${name%%.pattern} 和${name%.pattern}中如果pattern与name值末尾匹配,那么name值中去掉匹配部分后就是表达式的值,否则该表达式的值就是name的值
${name%%.pattern}中去掉部分是最多匹配的部分,只去掉了gz
${name%.pattern}中去掉的部分是最少匹配的部分,只保留了第一部分
(6)在 shell 命令终端输入 name=/usr/bin/X11,然后使用 echo 分别显示表达式①和②的值,观察结果。 修改 name 的值,让 name='/etc/apt/sources.list.d',再次使用 echo 分别显示表达式①和②的值,观察结果。 结合结果,写出表达式的作用。 ① ${name#*/} ② ${name##*/}
与(5)中相似,区别在于%表示从结尾处匹配,#表示从开头处匹配
(7)已知某同学提交的博客文章页面地址 address 如下: address='http://www.cnblogs.com/xyz/p/8569001.html' 通过字符串匹配,如何得到其博客主页地址: homepage='http://www.cnblogs.com/xyz' 写出由变量 address 得到变量 homepage 的 shell 命令实现。
2.脚本分析
(1) #!/bin/bash
count=$#
cmd=echo
while [ $count -gt 0 ]
Do
cmd="$cmd \$$count"
count=`expr $count - 1`
Done
eval $cmd
①整个程序可将参数倒序输出
在脚本ex1.sh中,$#是特殊Shell变量,指的是参数的个数。
②cmd="$cmd \$$count" $cmd为echo,\$$count表示最末一个参数,整个语句表示输出最末一个参数
count=`expr $count - 1` 表示参数数量减一
eval $cmd表示运行cmd中的命令
③第一条命令循环0 次,第二条2次,第三条3次
④echo $3
(2)
①who | grep “^$1”的功能为判断wll是否在当前系统存在
②line8~10的功能是将参数wll重定向到LimitString中,并发送hello。
(3)
功能为将寻找sh格式文件,将它们复制到新文件里,新文件名字为原文件名末尾加“BACKUP--当前时间(年月日时分)...”
(4)
line4-10 功能为读取输入变量存入x中,在下一行输出行号和该变量
line14 中条件满足时脚本调用NL函数,即上述功能
line17-line21功能为将参数读入函数NL中,shift 命令将参数左移一位,最左边的参数丢弃。
3.脚本编写
(1)编写一个shell脚本,它把第二个位置参数以及其后的各个参数指定的文件复制到第一个位置参数指定的目录中。
(2)打印给定目录下的某些文件,由第一个参数指出文件所在的目录,其余参数是要打印的文件名。
(3)利用for循环将当前目录下的.c文件移到指定的目录下,并按文件大小排序,显示移动后指定目录的内容
(3)设计一个程序cuts,它由标准输入读取数据,获取由第一个参数n和第二个参数m所限定范围的数据,n和m都是整数,即从输入的字符串中抽取第n个字符至第m个字符之间的所有字符(包括这两个字符)。例如:
$cuts 11 14
this is a test of cuts program (输入)
test (结果)
5.猜数字游戏,具体要求如下:
①写一个函数random_100生成0~100之间的随机数
②用户从键盘输入竞猜数字,如果猜错了,提示用户所猜数字偏大或偏小,用户继续猜,直到猜对为止。