实验8Shell Script1.docx

上传人:b****2 文档编号:3008894 上传时间:2023-05-05 格式:DOCX 页数:11 大小:32.11KB
下载 相关 举报
实验8Shell Script1.docx_第1页
第1页 / 共11页
实验8Shell Script1.docx_第2页
第2页 / 共11页
实验8Shell Script1.docx_第3页
第3页 / 共11页
实验8Shell Script1.docx_第4页
第4页 / 共11页
实验8Shell Script1.docx_第5页
第5页 / 共11页
实验8Shell Script1.docx_第6页
第6页 / 共11页
实验8Shell Script1.docx_第7页
第7页 / 共11页
实验8Shell Script1.docx_第8页
第8页 / 共11页
实验8Shell Script1.docx_第9页
第9页 / 共11页
实验8Shell Script1.docx_第10页
第10页 / 共11页
实验8Shell Script1.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验8Shell Script1.docx

《实验8Shell Script1.docx》由会员分享,可在线阅读,更多相关《实验8Shell Script1.docx(11页珍藏版)》请在冰点文库上搜索。

实验8Shell Script1.docx

实验8ShellScript1

实验八:

ShellScript

1实验目的

通过实验掌握Linuxbash

2实验设备

硬件:

PC机一台

软件:

Windows98/XP/2000系统,VMwareWorkstation6.0,RedHatLinux

3实验内容

(1)Shell中的变量:

用户自定义变量与环境变量

(2)命令别名

(3)Bashshell的操作环境

(4)数据流重定向

(5)管道命令

4实验预习要求

仔细阅读参考书:

【1】鸟哥的Linux私房菜基础学习篇第三版,人民邮电出版社,鸟哥

【2】嵌入式Linux系统开发标准教程,人民邮电出版社,华清远见嵌入式培训中心

【3】嵌入式Linux应用程序开发标准教程,人民邮电出版社,华清远见嵌入式培训中心

5实验步骤

6实验重点:

(1)什么是ShellScript

Shellscript是利用shell的功能所写的一个“程序(program)”,这个程序是使用纯文本文件,将一些shell的语法与命令写在里面,搭配正规表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的。

(2)第一个ShellScript的编写与执行

shellscript其实就是纯文本文件,我们可以编辑这个文件,然后让这个文件来帮我们一次运行多个命令,或者是利用一些运算与逻辑判断来帮我们达成某些功能。

在shellscript的编写中还需要注意如下事项:

●命令的运行是从上而下、从左而右的分析与运行;

●命令的执行:

命令、参数间的多个空白都会被忽略掉;

●空白行也将被忽略掉,并且[tab]按键所在的空白同样视为空白键;

●如果读取到一个Enter符号(CR),就尝试开始运行该行命令;

●如果一行的内容太多,则可以使用“\[Enter]”来扩展至下一行;

●“#“可做为注解!

运行shellscript的方法:

假设shellscript放在/root/shell/shell.sh中。

a)直接执行命令:

shell.sh文件必须要具备可读与可运行(rx)的权限,然后:

i.绝对路径:

使用/root/shell/shell.sh来执行命令;

ii.相对路径:

假设工作目录在/root/shell/,则使用./shell.sh来运行

iii.变量PATH功能:

将shell.sh放在PATH指定的目录内,例如:

~/bin/

b)以bash程序来运行:

通过”bashshell.sh“或”shshell.sh“来运行

若shell.sh在~/bin内且具有rx的权限,那就直接输入shell.sh即可运行该脚本程序!

当使用shshell.sh或bashshell.sh时,shell.sh只要有r的权限即可被运行

编写第一个shellscript

[root@localhost~]#mkdirshellscripts;cdshellscripts

[root@localhostshellscripts]#vish01.sh

#!

/bin/bash

#Program:

#Thisprogramshows"HelloWorld!

"inyourscreen.

#History:

#2012-03-18EE.HBUEFirstrelease

echo"HelloWorld!

\n"

exit0

在本章当中,请将所有编写的script放置到root/shellscript这个目录内,

程序分析:

●第一行#!

/bin/bash声明这个script使用的shell名称:

因为我们使用的是bash,所以,必须要以“#!

/bin/bash”来声明这个文件内的语法使用bash的语法!

那么当这个程序被运行时,他就能够加载bash的相关环境设置档(一般来说就是non-loginshell的~/.bashrc),并且运行bash来使下面的命令能够运行!

这很重要的!

(在很多状况中,如果没有设置好这一行,那么该程序很可能会无法运行,因为系统可能无法判断该程序需要使用什么shell来运行!

●程序内容的说明:

整个script当中,除了第一行的“#!

”是用来声明shell的之外,其他的#都是注解用途!

所以上面的程序当中,第二行以下就是用来说明整个程序的基本数据。

一般来说,建议一定要养成说明该script的:

1.内容与功能;2.版本信息;3.作者与联络方式;4.创建日期;5.历史纪录等等。

●主要环境变量的声明:

建议务必要将一些重要的环境变量设置好,其中PATH是当中最重要的!

如此一来,则可让我们这个程序在进行时,可以直接执行一些外部命令,而不必写绝对路径!

●主要程序部分:

就将主要的程序写好即可!

在这个例子当中,就是echo那一行!

●告知运行结果(定义返回值):

可以利用exit这个命令来让程序中断,并且返回一个数值给系统。

在这个例子当中,使用exit0,这代表离开script并且返回一个0给系统,所以运行完这个script后,若执行echo$?

则可得到0的值!

运行结果:

[root@localhostscripts]#shsh01.sh

HelloWorld!

另外,也可以利用:

”chmoda+xsh01.sh;./sh01.sh”来运行这个script!

ShellScriptOne:

交互式脚本:

变量内容由用户决定

很多时候我们需要用户输入一些内容,好让程序可以顺利运行。

示例中使用read命令,编写一个script,可以让用户输入:

1.firstname与2.lastname,最后并且在屏幕上显示:

Yourfullnameis:

的内容:

[root@localhostshellscripts]#vish02.sh

#!

/bin/bash

#Program:

#Userinputshisfirstnameandlastname.Programshowshisfullname.

#History:

#2012-03-18EE.HBUEFirstrelease

read-p"Pleaseinputyourfirstname:

"firstname#提示用户输入

read-p"Pleaseinputyourlastname:

"lastname#提示用户输入

echo"\nYourfullnameis:

$firstname$lastname"#结果由屏幕输出

ShellScriptTwo:

随日期变化:

利用date进行文件的创建

常用于文件备份的功能:

想要以日期来创建文件,亦即filename_20120317,filename_20120318,filename_20120319,该如何编写shellscript?

[root@localhostscripts]#vish03.sh

#!

/bin/bash

#1.让用户输入文件名称,并取得fileuser这个变量;

echo"Iwilluse'touch'commandtocreate3files."#纯粹显示信息

read-p"Pleaseinputyourfilename:

"fileuser#提示用户输入

#2.为了避免用户随意按Enter,利用变量功能分析文件名是否有设置?

filename=${fileuser:

-"filename"}#开始判断有否设置文件名

#3.开始利用date命令来取得所需要的文件名了;

date1=$(date--date='2daysago'+%Y%m%d)#前两天的日期

date2=$(date--date='1daysago'+%Y%m%d)#前一天的日期

date3=$(date+%Y%m%d)#今天的日期

file1=${filename}”_”${date1}#下面三行设置文件名

file2=${filename}”_”${date2}

file3=${filename}”_”${date3}

#4.创建文件名!

touch"$file1"

touch"$file2"

touch"$file3"

上面的示例包括命令$(command)的取得信息、变量的设置功能、变量的累加以及利用touch命令辅助!

可以进行两次运行:

一次直接按[Enter]来查看文件名是啥?

一次可以输入一些文字,这样可以判断脚本是否设计正确!

ShellScriptThree:

数值运算:

简单的加减乘除

我们可以使用declare来定义变量的类型。

当变量定义成为整数后才能够进行加减运算!

此外,我们也可以利用“$((计算式))”来进行数值运算的。

可惜的是,bashshell默认仅支持到整数的数据。

示例中我们要用户输入两个变量,然后将两个变量的内容相乘,最后输出相乘的结果:

[root@localhostscripts]#vish04.sh

#!

/bin/bash

#Program:

#Userinputs2integernumbers;programwillcrossthesetwonumbers.

#History:

#2012-03-18EE.HBUEFirstrelease

echo"YouSHOULDinput2numbers,Iwillcrossthem!

\n"

read-p"firstnumber:

"firstnu

read-p"secondnumber:

"secnu

total=$(($firstnu*$secnu))

echo"\nTheresultof$firstnux$secnuis==>$total"

在数值的运算上,可以使用declare-itotal=$firstnu*$secnu也可以使用上面的方式来进行!

基本上,比较建议使用这样的方式来进行运算:

var=$((运算内容))

数值运算包括有:

+,-,*,/,%等等。

(3)script的运行方式的差异(source,shscript,./script)

不同的script运行方式会造成不一样的结果!

尤其对bash的环境影响很大!

脚本的运行方式除了前面的方式之外,还可以利用source或小数点(.)来运行!

那么这几种运行方式有何不同?

当使用前面的直接命令执行(不论是绝对路径/相对路径还是$PATH内),或者是利用bash(或sh)来执行脚本时,该script都会使用一个新的bash环境来运行脚本内的命令!

也就是说,用户使用这种运行方式时,其实script是在子程序的bash内运行的!

在sh02.sh这个脚本中,用户自行设置两个变量,分别是firstname与lastname,看一看如下的运行结果:

[root@localhostscripts]#echo$firstname$lastname

<==确认了,这两个变量并不存在喔!

[root@localhostscripts]#shsh02.sh

Pleaseinputyourfirstname:

HBUE<==这个名字是自己输入的

Pleaseinputyourlastname:

EE

Yourfullnameis:

HBUEEE<==在script运行中,这两个变量有生效

[root@localhostscripts]#echo$firstname$lastname

<==事实上,这两个变量在父程序的bash中还是不存在的!

上面的结果中利用sh02.sh设置好的变量竟然在bash环境下无效!

如果将程序相关性绘制成图的话,以下图来说明。

当你使用直接运行的方法来处理时,系统会给予一支新的bash来运行sh02.sh里面的命令,因此firstname,lastname等变量其实是在下图中的子程序bash内运行的。

当sh02.sh运行完毕后,子程序bash内的所有数据便被删除,因此,在父程序下echo$firstname时,就看不到任何东西。

利用source来运行脚本:

在父程序中运行

如果使用source来运行命令那就不一样:

[root@localhostscripts]#sourcesh02.sh

Pleaseinputyourfirstname:

HBUE

Pleaseinputyourlastname:

EE

Yourfullnameis:

HBUEEE

[root@localhostscripts]#echo$firstname$lastname

HBUEEE<==有数据产生!

变量有值了!

source对script的运行方式可以使用下面的图示来说明!

sh02.sh会在父程序中运行的,因此各项操作都会在原本的bash内生效!

这也是为什么不注销系统而要让某些写入~/.bashrc的设置生效时,需要使用source~/.bashrc而不能使用bash~/.bashrc是一样的!

 

(4)命令执行的判断依据:

;&&||

在某些时候,我们希望可以一次运行多个命令,例如在关机的时候希望可以先运行两次sync同步化写入磁盘后才shutdown计算机,那么可以怎么作?

[root@localhost~]#sync;sync;shutdown-hnow

在命令与命令中间利用分号(;)来隔开,这样一来,分号前的命令运行完后就会立刻接着运行后面的命令了。

如果想要在某个目录底下创建一个文件,也就是说,如果该目录存在的话,才创建这个文件,如果不存在,那就不创建了。

也就是说这两个命令彼此之间是有相关性的,前一个命令是否成功的运行与后一个命令是否要运行有关!

那就得使用到&&或||!

$?

(命令回传值)与&&或||

两个命令之间有相依性,而这个相依性主要判断的地方就在于前一个命令运行的结果是否正确。

若前一个命令运行的结果为正确,在Linux下会回传一个$?

=0的值。

那么我们怎么通过这个回传值来判断后续的命令是否要运行?

这就得使用&&和||了!

命令执行情况说明

命令执行方式

说明

cmd1&&cmd2

1.若cmd1运行完毕且正确运行($?

=0),则开始运行cmd2。

2.若cmd1运行完毕且为错误($?

≠0),则cmd2不运行。

cmd1||cmd2

1.若cmd1运行完毕且正确运行($?

=0),则cmd2不运行。

2.若cmd1运行完毕且为错误($?

≠0),则开始运行cmd2。

上述的cmd1及cmd2都是命令。

我们刚刚假想的情况,就是想要:

(1)先判断一个目录是否存在;

(2)若存在才在该目录底下创建一个文件。

在这里我们使用ls以及回传值来判断目录是否存在。

示例一:

使用ls查阅目录/tmp/abc是否存在,若存在则用touch创建/tmp/abc/hehe

[root@localhost~]#ls/tmp/abc&&touch/tmp/abc/hehe

ls:

/tmp/abc:

Nosuchfileordirectory

#ls找不到该目录,但并没有touch的错误,表示touch并没有运行

[root@localhost~]#mkdir/tmp/abc

[root@localhost~]#ls/tmp/abc&&touch/tmp/abc/hehe

如果/tmp/abc不存在时,touch就不会被运行,若/tmp/abc存在的话,那么touch就会开始运行!

不过,能不能自动判断,如果没有该目录就给予创建呢?

参考:

示例二:

测试/tmp/abc是否存在,若不存在则予以创建,若存在就不作任何事情

[root@localhost~]#rm-r/tmp/abc<==先删除此目录以方便测试

[root@localhost~]#ls/tmp/abc||mkdir/tmp/abc

ls:

/tmp/abc:

Nosuchfileordirectory<==真的不存在!

如果一再重复ls/tmp/abc||mkdir/tmp/abc,也不会出现重复mkdir的错误!

这是因为/tmp/abc已经存在,所以后续的mkdir就不会执行!

如果想要创建/tmp/abc/hehe这个文件,但我并不知道/tmp/abc是否存在,那该如何处理:

示例三:

不清楚/tmp/abc是否存在,但就是要创建/tmp/abc/hehe文件

[root@localhost~]#ls/tmp/abc||mkdir/tmp/abc&&touch/tmp/abc/hehe

上面这个示例三总是会创建/tmp/abc/hehe!

不论/tmp/abc是否存在。

那么示例三应该如何解释呢?

由于Linux底下的命令都是由左往右运行的,所以示例三有几种结果我们来分析一下:

(1)若/tmp/abc不存在故回传$?

≠0,则因为||遇到非为0的$?

故开始mkdir/tmp/abc,由于mkdir/tmp/abc会成功进行,所以回传$?

=0因为&&遇到$?

=0故会运行touch/tmp/abc/hehe,最终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测试/tmp/hbue是否存在,若存在则显示"exist",若不存在,则显示"notexist"!

答:

牵涉到逻辑判断的问题,如果存在就显示某个数据,若不存在就显示其他数据,可以这样做:

ls/tmp/hbue&&echo"exist"||echo"notexist"

意思是说,当ls/tmp/hbue运行后,若正确,就运行echo"exist",若有问题,就运行echo"notexist"!

那如果写成如下的状况会出现什么?

ls/tmp/hbue||echo"notexist"&&echo"exist"

这其实是有问题的,为什么呢?

由图的流程介绍我们知道命令是一个一个往后运行,因此在上面的例子当中,如果/tmp/hbue不存在时,他会进行如下操作:

若ls/tmp/hbue不存在,因此回传一个非为0的数值;

接下来经过||的判断,发现前一个命令回传非为0的数值,因此,程序开始运行echo"notexist",而echo"notexist"程序肯定可以运行成功,因此会回传一个0值给后面的命令;经过&&的判断,所以就开始运行echo"exist"。

所以啊,第二个例子里面竟然会同时出现notexist与exist。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

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

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