ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:32.11KB ,
资源ID:5655036      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-5655036.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验8Shell Script1文档格式.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

实验8Shell Script1文档格式.docx

1、 空白行也将被忽略掉,并且 tab 按键所在的空白同样视为空白键; 如果读取到一个 Enter 符号 (CR) ,就尝试开始运行该行命令; 如果一行的内容太多,则可以使用“ Enter ”来扩展至下一行; “ # “可做为注解! 运行shell script的方法:假设shell script放在 /root/shell/shell.sh中。a) 直接执行命令:shell.sh文件必须要具备可读与可运行 (rx) 的权限,然后:i. 绝对路径:使用/root/shell/shell.sh 来执行命令;ii. 相对路径:假设工作目录在/root/shell/,则使用 ./shell.sh 来运行

2、iii. 变量PATH功能:将 shell.sh 放在 PATH 指定的目录内,例如: /bin/b) 以 bash 程序来运行:通过” bash shell.sh “或” sh shell.sh “来运行若 shell.sh 在 /bin 内且具有 rx 的权限,那就直接输入 shell.sh 即可运行该脚本程序!当使用 sh shell.sh 或 bash shell.sh时,shell.sh 只要有 r 的权限即可被运行编写第一个shell scriptrootlocalhost # mkdir shellscripts; cd shellscriptsrootlocalhost she

3、llscripts# vi sh01.sh#!/bin/bash# Program:# This program shows Hello World! in your screen.# History:# 2012-03-18 EE.HBUE First releaseecho nexit 0在本章当中,请将所有编写的 script 放置到root/shellscript 这个目录内,程序分析: 第一行 #!/bin/bash 声明这个 script 使用的 shell 名称:因为我们使用的是 bash ,所以,必须要以“ #!/bin/bash ”来声明这个文件内的语法使用 bash 的语法

4、!那么当这个程序被运行时,他就能够加载 bash 的相关环境设置档 (一般来说就是 non-login shell 的 /.bashrc), 并且运行 bash 来使下面的命令能够运行!这很重要的!(在很多状况中,如果没有设置好这一行, 那么该程序很可能会无法运行,因为系统可能无法判断该程序需要使用什么 shell 来运行!) 程序内容的说明:整个 script 当中,除了第一行的“ #! ”是用来声明 shell 的之外,其他的 # 都是注解用途! 所以上面的程序当中,第二行以下就是用来说明整个程序的基本数据。一般来说,建议一定要养成说明该 script 的:1. 内容与功能; 2. 版本信

5、息; 3. 作者与联络方式; 4. 创建日期;5. 历史纪录 等等。 主要环境变量的声明:建议务必要将一些重要的环境变量设置好,其中 PATH 是当中最重要的! 如此一来,则可让我们这个程序在进行时,可以直接执行一些外部命令,而不必写绝对路径! 主要程序部分:就将主要的程序写好即可!在这个例子当中,就是 echo 那一行! 告知运行结果 (定义返回值):可以利用 exit 这个命令来让程序中断,并且返回一个数值给系统。 在这个例子当中,使用 exit 0 ,这代表离开 script 并且返回一个 0 给系统, 所以运行完这个 script 后,若执行 echo $? 则可得到 0 的值!运行结

6、果:rootlocalhost scripts# sh sh01.shHello World !另外,也可以利用:”chmod a+x sh01.sh; ./sh01.sh”来运行这个 script!Shell Script One: 交互式脚本:变量内容由用户决定很多时候我们需要用户输入一些内容,好让程序可以顺利运行。示例中使用 read 命令,编写一个 script ,可以让用户输入:1. first name 与 2. last name, 最后并且在屏幕上显示:Your full name is: 的内容:rootlocalhost shellscripts# vi sh02.sh#

7、User inputs his first name and last name. Program shows his full name.read -p Please input your first name: firstname # 提示用户输入Please input your last name: lastname # 提示用户输入nYour full name is: $firstname $lastname # 结果由屏幕输出Shell Script Two:随日期变化:利用 date 进行文件的创建常用于文件备份的功能:想要以日期来创建文件,亦即 filename_201203

8、17, filename_20120318, filename_20120319 ,该如何编写shell script?rootlocalhost scripts# vi sh03.sh# 1. 让用户输入文件名称,并取得 fileuser 这个变量;echo I will use touch command to create 3 files. # 纯粹显示信息Please input your filename: fileuser # 提示用户输入# 2. 为了避免用户随意按 Enter ,利用变量功能分析文件名是否有设置?filename=$fileuser:-filename # 开始

9、判断有否设置文件名# 3. 开始利用 date 命令来取得所需要的文件名了;date1=$(date -date=2 days ago +%Y%m%d) # 前两天的日期date2=$(date -date=1 days ago +%Y%m%d) # 前一天的日期date3=$(date +%Y%m%d) # 今天的日期file1=$filename”_”$date1 # 下面三行设置文件名file2=$filename”_”$date2file3=$filename”_”$date3# 4. 创建文件名!touch $file1$file2$file3上面的示例包括命令 $(command)

10、 的取得信息、变量的设置功能、变量的累加以及利用 touch 命令辅助!可以进行两次运行:一次直接按 Enter 来查看文件名是啥? 一次可以输入一些文字,这样可以判断脚本是否设计正确!Shell Script Three: 数值运算:简单的加减乘除我们可以使用 declare 来定义变量的类型。当变量定义成为整数后才能够进行加减运算!此外,我们也可以利用“ $(计算式) ”来进行数值运算的。 可惜的是, bash shell默认仅支持到整数的数据。示例中我们要用户输入两个变量, 然后将两个变量的内容相乘,最后输出相乘的结果:rootlocalhost scripts# vi sh04.sh#

11、 User inputs 2 integer numbers; program will cross these two numbers.You SHOULD input 2 numbers, I will cross them!first number: firstnusecond number: secnutotal=$($firstnu*$secnu)nThe result of $firstnu x $secnu is = $total在数值的运算上,可以使用 declare -i total=$firstnu*$secnu 也可以使用上面的方式来进行!基本上,比较建议使用这样的方式来

12、进行运算:var=$(运算内容)数值运算包括有: +, -, *, /, % 等等。(3)script 的运行方式的差异 (source, sh script, ./script)不同的 script 运行方式会造成不一样的结果!尤其对bash 的环境影响很大!脚本的运行方式除了前面的方式之外,还可以利用 source 或小数点 (.) 来运行!那么这几种运行方式有何不同?当使用前面的直接命令执行 (不论是绝对路径/相对路径还是 $PATH 内),或者是利用 bash (或 sh) 来执行脚本时, 该 script 都会使用一个新的 bash 环境来运行脚本内的命令!也就是说,用户使用这种运行

13、方式时, 其实 script 是在子程序的 bash 内运行的!在sh02.sh 这个脚本中,用户自行设置两个变量,分别是 firstname 与 lastname,看一看如下的运行结果:rootlocalhost scripts# echo $firstname $lastname =确认了,这两个变量并不存在喔!rootlocalhost scripts# sh sh02.sh HBUE =这个名字是自己输入的 EE HBUE EE =在 script 运行中,这两个变量有生效=事实上,这两个变量在父程序的 bash 中还是不存在的!上面的结果中利用 sh02.sh 设置好的变量竟然在 b

14、ash 环境下无效!如果将程序相关性绘制成图的话,以下图来说明。当你使用直接运行的方法来处理时,系统会给予一支新的 bash 来运行 sh02.sh 里面的命令,因此 firstname, lastname 等变量其实是在下图中的子程序 bash 内运行的。 当 sh02.sh 运行完毕后,子程序 bash 内的所有数据便被删除,因此,在父程序下 echo $firstname 时, 就看不到任何东西。利用 source 来运行脚本:在父程序中运行如果使用 source 来运行命令那就不一样:rootlocalhost scripts# source sh02.sh HBUE EE HBUE

15、EEHBUE EE =有数据产生!变量有值了! source 对 script 的运行方式可以使用下面的图示来说明! sh02.sh 会在父程序中运行的,因此各项操作都会在原本的 bash 内生效!这也是为什么不注销系统而要让某些写入 /.bashrc 的设置生效时,需要使用 source /.bashrc 而不能使用bash /.bashrc 是一样的!(4)命令执行的判断依据: ; & |在某些时候,我们希望可以一次运行多个命令,例如在关机的时候希望可以先运行两次 sync 同步化写入磁盘后才 shutdown 计算机,那么可以怎么作?rootlocalhost # sync; sync;

16、 shutdown -h now在命令与命令中间利用分号 (;) 来隔开,这样一来,分号前的命令运行完后就会立刻接着运行后面的命令了。如果想要在某个目录底下创建一个文件,也就是说,如果该目录存在的话, 才创建这个文件,如果不存在,那就不创建了。也就是说这两个命令彼此之间是有相关性的, 前一个命令是否成功的运行与后一个命令是否要运行有关!那就得使用到 & 或 |!$? (命令回传值) 与 & 或 |两个命令之间有相依性,而这个相依性主要判断的地方就在于前一个命令运行的结果是否正确。若前一个命令运行的结果为正确,在 Linux 下会回传一个 $? = 0 的值。 那么我们怎么通过这个回传值来判断后

17、续的命令是否要运行?这就得使用&和|了!命令执行情况说明命令执行方式说明cmd1 & cmd21. 若 cmd1 运行完毕且正确运行($?=0),则开始运行 cmd2。2. 若 cmd1 运行完毕且为错误 ($?0),则 cmd2 不运行。cmd1 | cmd2=0),则 cmd2 不运行。0),则开始运行 cmd2。上述的 cmd1 及 cmd2 都是命令。我们刚刚假想的情况,就是想要: (1)先判断一个目录是否存在; (2)若存在才在该目录底下创建一个文件。在这里我们使用 ls 以及回传值来判断目录是否存在。示例一:使用 ls 查阅目录 /tmp/abc 是否存在,若存在则用 touch

18、创建 /tmp/abc/hehe rootlocalhost # ls /tmp/abc & touch /tmp/abc/hehels: /tmp/abc: No such file or directory # ls 找不到该目录,但并没有 touch 的错误,表示 touch 并没有运行rootlocalhost # mkdir /tmp/abc如果 /tmp/abc 不存在时,touch 就不会被运行,若 /tmp/abc 存在的话,那么 touch 就会开始运行!不过,能不能自动判断,如果没有该目录就给予创建呢? 参考:示例二:测试 /tmp/abc 是否存在,若不存在则予以创建,若

19、存在就不作任何事情rootlocalhost # rm -r /tmp/abc =先删除此目录以方便测试rootlocalhost # ls /tmp/abc | mkdir /tmp/abc No such file or directory =真的不存在!如果一再重复ls /tmp/abc | mkdir /tmp/abc,也不会出现重复 mkdir 的错误!这是因为 /tmp/abc 已经存在, 所以后续的 mkdir 就不会执行!如果想要创建 /tmp/abc/hehe 这个文件, 但我并不知道 /tmp/abc 是否存在,那该如何处理:示例三:不清楚 /tmp/abc 是否存在,但就

20、是要创建 /tmp/abc/hehe 文件rootlocalhost # ls /tmp/abc | mkdir /tmp/abc &上面这个示例三总是会创建 /tmp/abc/hehe !不论 /tmp/abc 是否存在。那么示例三应该如何解释呢? 由于Linux 底下的命令都是由左往右运行的,所以示例三有几种结果我们来分析一下:(1)若 /tmp/abc 不存在故回传 $?0,则 因为 | 遇到非为 0 的 $? 故开始 mkdir /tmp/abc,由于 mkdir /tmp/abc 会成功进行,所以回传 $?=0因为 & 遇到 $?=0 故会运行 touch /tmp/abc/hehe

21、,最终 hehe 就被创建了;(2)若 /tmp/abc 存在故回传 $?=0,则因为 | 遇到 0 的 $? 不会进行,此时 $?=0 继续向后传,故因为 &=0 就开始创建 /tmp/abc/hehe 了!最终 /tmp/abc/hehe 被创建起来。整个流程图示如下:上面这张图显示的两股数据中,上方的线段为不存在 /tmp/abc 时所进行的命令行为,下方的线段则是存在 /tmp/abc 所在的命令行为。如上所述,下方线段由于存在 /tmp/abc 所以导致 $?=0 ,让中间的 mkdir 就不运行了! 并将 $?=0 继续往后传给后续的 touch 去利用例题:以 ls 测试 /tm

22、p/hbue 是否存在,若存在则显示 exist ,若不存在,则显示 not exist!答:牵涉到逻辑判断的问题,如果存在就显示某个数据,若不存在就显示其他数据,可以这样做:ls /tmp/hbue & echo | echo 意思是说,当 ls /tmp/hbue 运行后,若正确,就运行 echo ,若有问题,就运行 echo !那如果写成如下的状况会出现什么?ls /tmp/hbue | echo &这其实是有问题的,为什么呢?由图的流程介绍我们知道命令是一个一个往后运行, 因此在上面的例子当中,如果 /tmp/hbue 不存在时,他会进行如下操作:若 ls /tmp/hbue 不存在,因此回传一个非为 0 的数值;接下来经过 | 的判断,发现前一个命令回传非为 0 的数值,因此,程序开始运行 echo ,而 echo 程序肯定可以运行成功,因此会回传一个 0 值给后面的命令;经过 & 的判断,所以就开始运行 echo 。所以啊,第二个例子里面竟然会同时出现 not exist 与 exist。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2