一、知识点梳理
1. shell程序建立和执行的方法
建立shell程序可使用任意的文本编辑器。如vi/vim, gedit,Emacs均可。
shell命令的使用方法:
(1)直接在shell终端逐行输入命令执行
(2)将多行命令写入文件(shell脚本),一次性执行
(3)直接输入脚本程序文件名,需要做两项额外的工作:<1>修改文件权限:如chmod a+x filename / chmod 755 filename <2>修改环境变量PATH的值,如:PATH=$PATH:.
shell脚本的执行方式:
<1>bash script-name 或 sh script-name:该方法是当脚本文件本身没有可执行权限时,或者文件开头没有指定解释器时常使用的方法
<2>path/script-name 或 ./script-name (当前路径下执行脚本) :该方式需要脚本有执行权限
<3>source script-name 或 . script-name
<4>用重定向或者管道来执行
2. shell特殊符号的含义和用法(单引号、双引号、倒引号、重定向符号、管道线等)
#井号:常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行,如果被用在指令中,或者引号双引号括住的话,或者在倒斜线的后面,那他就变成一般符号,不具上述的特殊功能。
单引号:被单引号用括住的内容,将被视为单一字串。在引号内的代表变数的$符号,没有作用,也就是说,他被视为一般符号处理,防止任何变量替换。
双引号:双引号内的字符除了$、倒引号、反斜线、感叹号外均作为普通字符处理。它防止通配符扩展,但允许变量扩展。
倒引号:倒引号括住的是倒单引号,如在倒单引号里` date +%F`会被视为指令执行。
管道线:连结上个指令的标准输出,做为下个指令的标准输入。
>重定向:命令echo的执行结果输出到文件aa中。若原来已经存在文件aa,系统会把原来的内容覆盖。
>>重定向:命令echo的执行结果输出到文件aa末尾。若原来文件已经存在,不会覆盖原来内容。若原来文件不存在,则创建一个新文件。
3. shell中普通变量、位置变量、环境变量的用法(4.6节)
shell中的普通变量, 仅能被当前shell访问, 不能被其子进程访问, 更不能被其它shell访问。 当然, 它也可以被unset掉。
位置变量的赋值有两种方式:方式1: 在shell命令终端给出实参,传给位置变量;方式2: 使用set命令设置
特殊变量:
$# 表示命令行上实际参数的个数(不包括shell程序名本身)
$* 表示命令行实际给出的所有实参字符串
$@ 表示命令行实际给出的所有实参字符串
查看环境变量:
(1)env命令:查看所有的系统环境变量
(2)export命令:查看当前shell中所有的环境变量
(3)set命令:查看所有本地定义的环境变量及普通变量
(4)echo $环境变量名
4. 算术运算
执行算术运算的方式:
方式1:$[算术表达式]
方式2: ((算术表达式 ))
方式3:let 算术表达式
方式4:expr 算术表达式
5. shell关键字if, case, while, for, until;shell函数的编写和使用
if命令:

case命令:

while命令

for命令

until命令

二、实验内容
1. shell变量基本用法及常用符号使用
此部分要求写出实现相应要求的shell命令,截图显示
(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中已经设置好的元素的个数
④${#likes[@]}
显示数组likes中已经设置好的元素的个数
⑤${#likes}
显示数组likes中已经设置好的元素的个数
⑥${#likes[0]}
显示likes数组的第一个元素的长度
(提示:参考教材4.6.2节和4.6.3节)

(4)在shell命令终端输入name=Phoenix,然后使用echo显示表达式①,观察结果;然后输入命令unset name,再输入表达式①观察结果。结合两次结果,写出表达式的作用。
①${name:-hello}
(提示:参考教材4.7节)

表达式的作用:如果name不为空,引用name这个变量的内容,如果为空则输出-后面的字符串的内容
(5)在shell命令终端输入name='/usr/share/doc/apg/php.tar.gz',然后使用echo分别显示表达式①和②的值,观察结果。
修改name的值,让name='/etc/apt/sources.list.d',再次使用echo分别显示表达式①和②的值,观察结果。
结合结果,写出表达式的作用。
① ${name%%.*}②${name%.*}
(提示:参考教材4.6.3节)

两个%表示去掉做多匹配的部分即去掉全部后缀,所以只显示了文件名。
(6)在shell命令终端输入name=/usr/bin/X11,然后使用echo分别显示表达式①和②的值,观察结果。
修改name的值,让name='/etc/apt/sources.list.d',再次使用echo分别显示表达式①和②的值,观察结果。
结合结果,写出表达式的作用。
① ${name#*/}②${name##*/}
(提示:参考教材4.6.3节)


${name#*/}中pattern为*/,即匹配任意字符加上/。#表示去掉最少匹配部分,##表示去掉做多部分,所以,第一个name值中只去掉了/,当使用##时,去掉X11之前包含/的全部字符。
(7)已知某同学提交的博客文章页面地址address如下:
address='http://www.cnblogs.com/xyz/p/8569001.html'
通过字符串匹配,如何得到其博客主页地址:
homepage='http://www.cnblogs.com/xyz'
写出由变量address得到变量homepage的shell命令实现。
(提示:参考前序练习(5))

2. shell脚本分析
(1)使用vim/gedit编写shell脚本文件ex1.sh,其内容如下:(教材P145 思考题4.8)
在shell命令终端分3次运行该脚本,观察其运行结果。
①第1次运行:. ex1.sh
②第2次运行:. ex1.sh best wishes
③第3次运行:. ex1.sh god bless u

结合3次运行结果,分析脚本代码,在实验报告中总结以下内容:
① 整个shell脚本的功能是什么?
整个shell脚本可将参数倒序输出
② 第8行、第9行、第11行的功能是什么?
第8行中$cmd为echo,\$$count表示最后一个参数,所以第8行表示输出最后一个参数;第9行表示参数数量减一;第10行表示运行cmd中的命令
③ 每次运行时,脚本中的while循环分别执行几次?
整个脚本作用是参数倒序输出,while循环次数由参数决定。第一条命令循环0次;第二条命令循环2次;第三条命令循环3次
④运行. ex1.sh god bless u时,while循环体第1次被执行时,第8行执行后变量cmd的值为?
echo $3
(2)使用vim/gedit编写shell脚本文件ex2.sh,其内容如下:(教材P145 4.10)
在命令终端输入. ex2.sh jsj,(实际执行时,请将jsj替换为您电脑中的登录用户名)结合结果及帮助信息,回答下列问题。

① line6中,who | grep “^$1”的功能?
判断用户名hadoop是否在当前系统中。
② line8~10功能?
将参数重定向到LimitString中,并发送hello。
(3)使用vim/gedit编写shell脚本文件ex3.sh,其内容如下:
在命令终端输入. ex3.sh,结合结果及帮助信息,回答下列问题。
① 截图显示运行结果。

② 该脚本的功能是?
寻找.sh格式文件,将它们复制到新文件里,新文件名字为原文件名末尾+“BACKUP—当前时间”
(4)使用vim/gedit编写shell脚本文件ex4.sh,其内容如下:
在shell命令终端分3次运行该脚本,观察其运行结果。

① 第1次运行:. ex4.sh

② 第2次运行:. ex4.sh /etc/apt/sources.list

③第3次运行:. ex4.sh /etc/apt/sources.list ex4.sh

结合运行结果,分析shell脚本功能。回答:
① line4-10中函数NL的功能?
函数NL的功能为读取输入的变量并存入x中,在下一行输出行号和该变量
② line14中,条件测试满足时,脚本执行的功能是?
条件满足调用NL函数,实现的功能即为读取变量存入x中,在下一行输出行号和该变量。
③ line17-line21,这部分脚本的功能是?
将参数读入函数NL中,shift命令将参数左移一位,最左边的参数丢弃。
3. shell脚本编写
此部分要求贴出实现相应要求的shell脚本程序,并截图显示脚本执行及结果
(1) 编写一个shell脚本,它把第二个位置参数以及其后的各个参数指定的文件复制到第一个位置参数指定的目录中。

(2) 打印给定目录下的某些文件,由第一个参数指出文件所在的目录,其余参数是要打印的文件名。

(3) 利用for循环将当前目录下的.c文件移到指定的目录下,并按文件大小排序,显示移动后指定目录的内容

(4)设计一个程序cuts,它由标准输入读取数据,获取由第一个参数n和第二个参数m所限定范围的数据,n和m都是整数,即从输入的字符串中抽取第n个字符至第m个字符之间的所有字符(包括这两个字符)。例如:
$cuts 11 14
this is a test of cuts program (输入)
test (结果)

(5)猜数字游戏
具体要求如下:
①写一个函数random0_100生成0~100之间的随机数
②用户从键盘输入竞猜数字,如果猜错了,提示用户所猜数字偏大或偏小,用户继续猜,直至猜对为止。
(提示:shell内部系统变量RANDOM生成0~32767之间的整数随机数)


4. 修改配置文件定制个性化操作系统环境或编写shell脚本实现任务的自动化处理(选做)
shell脚本最大的用途之一就是用于编写一些小型脚本程序以实现任务处理的自动化。或,通过查阅资料,尝试修改配置文件,实现个性化的操作系统环境配置。
如果尝试的是编写shell脚本实现任务的自动化处理,请在报告中描述其应用场景、功能,并附上shell脚本。
如果尝试的是修改配置文件定制个性化操作系统,请在报告中截图显示具体实现的定制效果,及为了实现其而对配置文件做的具体修改;
该部分我在网络上搜索到的知识如下:
https://blog.csdn.net/pipisorry/article/details/39584489
https://www.aliyun.com/jiaocheng/214052.html
https://blog.csdn.net/wangzhaopeng0316/article/details/8498245

我进行的操作如下:

进行修改操作:将PS1变量设置的代码注释,然后修改PS1。

修改完发现root用户名变为红色

三、总结与体会
本次实验复习了shell脚本的操作命令,试着写shell脚本,之前很多会犯错误的空格,.这些细节练习地更多,越来越熟练了。但是总体上还是很费时间,很多地方依旧需要翻书上网查资料。
浙公网安备 33010602011771号