Shell编程基础教程Word文档下载推荐.docx

上传人:b****4 文档编号:17613631 上传时间:2022-12-07 格式:DOCX 页数:54 大小:153.49KB
下载 相关 举报
Shell编程基础教程Word文档下载推荐.docx_第1页
第1页 / 共54页
Shell编程基础教程Word文档下载推荐.docx_第2页
第2页 / 共54页
Shell编程基础教程Word文档下载推荐.docx_第3页
第3页 / 共54页
Shell编程基础教程Word文档下载推荐.docx_第4页
第4页 / 共54页
Shell编程基础教程Word文档下载推荐.docx_第5页
第5页 / 共54页
点击查看更多>>
下载资源
资源描述

Shell编程基础教程Word文档下载推荐.docx

《Shell编程基础教程Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Shell编程基础教程Word文档下载推荐.docx(54页珍藏版)》请在冰豆网上搜索。

Shell编程基础教程Word文档下载推荐.docx

九、Shell运算符12

1.算术运算符12

2.关系运算符13

3.布尔运算符14

4.字符串运算符15

5.文件测试运算符17

十、Shell注释18

十一、Shell字符串19

1.单引号19

2.双引号19

3.拼接字符串19

4.获取字符串长度19

5.提取子字符串20

十二、Shell数组20

1.定义数组20

2.读取数组20

3.获取数组的长度21

十三、Shellecho命令21

1.显示转义字符21

2.显示变量21

3.显示换行22

4.显示不换行22

5.显示结果重定向至文件22

6.原样输出字符串22

7.显示命令执行结果22

十四、Shellprintf命令22

十五、Shellifelse语句23

1.if...else语句23

2.if...else...fi语句24

3.if...elif...fi语句24

4.if语句其他用法25

十六、Shellcaseesac语句26

十七、Shellfor循环27

1.顺序输出当前列表中的数字:

27

2.顺序输出字符串中的字符:

28

3.没有in列表,选取命令行输入的参数:

4.显示主目录下以.bash开头的文件:

十八、Shellwhile循环28

十九、Shelluntil循环29

二十、Shell跳出循环30

1.break命令30

2.continue命令31

二十一、Shell函数32

1.不带return语句的函数32

2.带有return语句的函数33

3.函数嵌套33

二十二、Shell函数参数34

二十三、Shell输入输出重定向34

1.输出重定向34

2.输入重定向35

3.重定向深入讲解35

4.HereDocument36

二十四、Shell文件包含37

一、Shell简介

Shell诞生于Unix,是一个用C语言编写的程序,它既是一种命令语言,又是一种程序设计语言

Ø

命令语言:

它交互式地解释和执行用户输入的命令;

程序设计语言:

它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

Shell虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。

因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。

也可以说,shell使用的熟练程度反映了用户对Unix/Linux使用的熟练程度。

注意:

单独地学习Shell是没有意义的,请先学习Unix/Linux入门教程,了解Unix/Linux基础。

Shell有两种执行命令的方式:

交互式(Interactive):

解释并执行用户的命令,用户输入一条命令,Shell就解释执行一条。

批处理(Batch):

用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。

Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到Shell提示符下执行。

二、几种常见的Shell

上面提到过,Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本。

Unix/Linux上常见的Shell脚本解释器有sh、bash、csh、ksh等,习惯上把它们称作一种Shell。

1.sh

sh是Unix标准默认的shell,属于系统管理shell。

有如下几个突破:

脚本可以写在文件里被调用,比如sha.sh可以执行a.sh里面的shell命令

可以交互或者非交互的方式调用

可以同步执行也可以异步执行

支持输入输出的pipeline,就是管道方式

支持输入输出的重定向,就是现在使用的>

和>

>

提供一系列内置命令

提供流程控制基本的函数和结构

弱类型变量,就是可以直接a=1,不需要指定a为int

提供本地和全局的变量作用域

脚本执行前不需要编译

去掉goto功能

使用``进行命令执行替换

增加了for~do~done的循环

增加了case~in~esac的条件选择

文件描述符2>

代表错误信息导出

2.csh

csh是一种语法类似于C语言的脚本语言,后来csh引入了Tenex系统中的一些功能逐渐演化成了tcsh,现在我们所看到的csh其实是tcsh的一个软链接。

目前Mac系统上还保留了csh。

3.ksh

ksh是当时兼容性很高的脚本语言,在许多操作系统上都可用,除了向后兼容sh同时也吸取了csh的一些优点。

原来是一款专有软件,直到2000年才作为开源软件发布。

4.ash

ash是Linux中占用系统资源最少的一个小shell,之后又演变为dash,但是由于本身内部命令较少,使用起来很不方便所以未能流行起来。

5.bash

bash是Linux标准默认的shell,除了支持脚本的向后兼容性,bash还吸收了KShell和CShell的一些特性。

目前很多机器上的/bin/sh往往都链接到bash,我们以为我们是使用Bourneshell,实际上我们使用的是Bourne-Againshell

三、Shell与编译型语言的差异

大体上,可以将程序设计语言可以分为两类:

编译型语言和解释型语言。

1.编译型语言

很多传统的程序设计语言,例如Fortran、Ada、Pascal、C、C++和Java,都是编译型语言。

这类语言需要预先将我们写好的源代码(sourcecode)转换成目标代码(objectcode),这个过程被称作“编译”。

运行程序时,直接读取目标代码(objectcode)。

由于编译后的目标代码(objectcode)非常接近计算机底层,因此执行效率很高,这是编译型语言的优点。

但是,由于编译型语言多半运作于底层,所处理的是字节、整数、浮点数或是其他机器层级的对象,往往实现一个简单的功能需要大量复杂的代码。

例如,在C++里,就很难进行“将一个目录里所有的文件复制到另一个目录中”之类的简单操作。

2.解释型语言

解释型语言也被称作“脚本语言”。

执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(sourcecode),并将其转换成目标代码(objectcode),再由计算机运行。

因为每次执行程序都多了编译的过程,因此效率有所下降。

使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象;

缺点是它们的效率通常不如编译型语言。

不过权衡之下,通常使用脚本编程还是值得的:

花一个小时写成的简单脚本,同样的功能用C或C++来编写实现,可能需要两天,而且一般来说,脚本执行的速度已经够快了,快到足以让人忽略它性能上的问题。

脚本编程语言的例子有awk、Perl、Python、Ruby与Shell。

四、什么时候使用Shell

Shell是各UNIX系统之间通用的功能,并且经过了POSIX(可移植操作系统接口)的标准化。

所以Shell脚本只要“用心写”一次,即可应用到很多系统上。

之所以要使用Shell脚本是基于:

简单性:

Shell是一个高级语言,通过它,你可以简洁地表达复杂的操作。

可移植性:

使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。

开发容易:

可以在短时间内完成一个功能强大又好用的脚本。

测试工程师使用shell可以减少一些重复繁琐的工作,同时也能根据需要编写出更有效率的工作脚本

开发工程师用shell可以辅助完善代码的开发,使用shell代替一些复杂的代码

服务器工程师可以将大部分的工作全部通过shell脚本来实现来解放双手

五、第一个Shell脚本

使用touch或vi新建一个文件test.sh,这里扩展名为sh(sh代表shell),扩展名并不影响脚本执行,只是方便理解。

输入一些代码:

#!

/bin/bash

echo"

HelloWorld!

"

“#!

”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。

echo命令用于向窗口输出文本。

脚本编写完成后,需要赋予它执行的权限才能让脚本运行起来,使用chmod命令让脚本有执行权限

chmod+xtest.sh

执行脚本有两种方式,一种是通过【./】查找当前的脚本并执行,通过这种方式运行bash脚本,第一行一定要写对,好让脚本查找到正确的解释器。

./test.sh

注意,一定要写成./test.sh,而不是test.sh。

运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin,/sbin,/usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。

另一种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:

/bin/shtest.sh

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

例子:

下面的脚本使用read命令从stdin(标准输入)获取输入并赋值给NAME变量,最后在stdout(标准输出)上输出,运行看看结果是什么

Whatisyourname?

readNAME

Hello,$NAME"

六、Shell变量

Shell支持自定义变量。

1.定义变量

定义变量时,变量名不加美元符号($),如:

variableName="

value"

变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。

同时,变量名的命名须遵循如下规则:

1.1首个字符必须为字母(a-z,A-Z);

1.2中间不能有空格,可以使用下划线(_);

1.3不能使用标点符号;

1.4不能使用bash里的关键字(可用help命令查看保留关键字);

变量定义举例:

myUrl=

myNum=100

2.使用变量

使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:

your_name="

wukong"

echo$your_name

echo${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

forskillinAdaCoffeActionJava

do

Iamgoodat${skill}Script"

done

如果不给skill变量加花括号,写成echo"

Iamgoodat$skillScript"

,解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

推荐给所有变量加上花括号{},这是个好的编程习惯。

3.重新定义变量

已定义的变量,可以被重新定义,如:

echo${myUrl}

注意,第二次赋值的时候不能写$myUrl="

4.只读变量

使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

readonlymyUrl

运行脚本,结果如下:

/bin/sh:

NAME:

Thisvariableisreadonly.

5.删除变量

使用unset命令可以删除变量。

语法:

unsetvariable_name

变量被删除后不能再次使用;

unset命令不能删除只读变量。

举个例子:

/bin/sh

unsetmyUrl

echo$myUrl

上面的脚本没有任何输出。

6.变量类型

运行shell时,会同时存在三种变量:

6.1局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

6.2环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。

必要的时候shell脚本也可以定义环境变量,通过set命令可查看这些变量。

6.3shell变量

shell变量是由shell程序设置的特殊变量。

shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

七、Shell特殊变量

前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。

例如,$表示当前Shell进程的ID,即pid,看下面的代码:

$echo$$

运行结果

29949

特殊变量列表

变量

含义

$0

当前脚本的文件名

$n

传递给脚本或函数的参数。

n是一个数字,表示第几个参数。

例如,第一个参数是$1,第二个参数是$2。

$#

传递给脚本或函数的参数个数。

$*

传递给脚本或函数的所有参数。

$@

被双引号("

"

)包含时,与$*稍有不同,下面将会讲到。

$?

上个命令的退出状态,或函数的返回值。

$$

当前Shell进程ID。

对于Shell脚本,就是这些脚本所在的进程ID。

命令行参数

运行脚本时传递给脚本的参数称为命令行参数。

命令行参数用$n表示,例如,$1表示第一个参数,$2表示第二个参数,依次类推。

下面用一个脚本来看看这些所有的特殊变量:

FileName:

$0"

FirstParameter:

$1"

$2"

QuotedValues:

$@"

$*"

TotalNumberofParameters:

$#"

echo$?

echo$$

运行结果:

$./test.shZaraAli----Zara和Ali为传给test.sh脚本的2个参数

FileName:

./test.sh

Zara

SecondParameter:

Ali

ZaraAli

2

17895

$*和$@的区别

$*和$@都表示传递给函数或脚本的所有参数,不被双引号("

)包含时,都以"

$1"

$2"

…"

$n"

的形式输出所有参数。

但是当它们被双引号("

)包含时,"

$*"

会将所有的参数作为一个整体,以"

$1$2…$n"

的形式输出所有参数;

$@"

会将各个参数分开,以"

下面的例子可以清楚的看到$*和$@的区别:

printeachparamfrom\"

\$*\"

forvarin"

$var"

\$@\"

执行./test.sh"

a"

b"

c"

d"

,看到下面的结果:

printeachparamfrom"

abcd

a

b

c

d

八、Shell替换

如果表达式中包含特殊字符,Shell将会进行替换。

例如,在双引号中使用变量就是一种替换,转义字符也是一种替换。

1.转义字符替换

a=10

echo-e"

Valueofais$a\n"

Valueofais10

这里-e表示对转义字符进行替换。

如果不使用-e选项,将会原样输出:

Valueofais10\n

下面的转义字符都可以用在echo中:

转义字符

\\

反斜杠

\a

警报,响铃

\b

退格(删除键)

\f

换页(FF),将当前位置移到下页开头

\n

换行

\r

回车

\t

水平制表符(tab键)

\v

垂直制表符可以使用echo命令的-E选项禁止转义,默认也是不转义的;

使用-n选项可以禁止插入换行符。

2.命令替换

命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。

命令替换的语法:

`command`注意是反引号,不是单引号,这个键位于Esc键下方。

下面的例子中,将命令执行结果保存在变量中:

DATE=`date`

Dateis$DATE"

USERS=`who|wc-l`

Loggedinuserare$USERS"

UP=`date;

uptime`

Uptimeis$UP"

DateisThuJul203:

59:

57MST2009

Loggedinuserare1

UptimeisThuJul203:

03:

57up20days,14:

03,1user,loadavg:

0.13,0.07,0.15

3.变量替换

变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值

可以使用的变量替换形式:

形式说明

${var}变量本来的值

${var:

-word}如果变量var为空或已被删除(unset),那么返回word,但不改变var的值。

=word}如果变量var为空或已被删除(unset),那么返回word,并将var的值设置为word。

+word}如果变量var被定义,那么返回word,但不改变var的值。

请看下面的例子:

echo${var:

-"

Variableisnotset"

}

1-Valueofvaris${var}"

="

2-Valueofvaris${var}"

unsetvar

+"

Thisisdefaultvalue"

3-Valueofvaris$var"

var="

Prefix"

4-Valueofvaris$var"

Variableisnotset

1-Valueofvaris

2-ValueofvarisVariableisnotset

3-Valueofvaris

Thisisdefaultvalue

4-ValueofvarisPrefix

九、Shell运算符

Bash支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。

expr是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加:

val=`expr2+2`

Totalvalue:

$val"

运行脚本输出:

4

两点注意:

表达式和运算符之间要有空格,例如2+2是不对的,必须写成2+2,这与我们熟悉的大多数编程语言不一样。

完整的表达式要被``包含,注意这个字符不是常用的单引号,在Esc键下边。

1.算术运算符

先来看一个使用算术运算符的例子:

b=20

val=`expr$a+$b`

a+b:

val=`expr$a-$b`

a-b:

val=`expr$a\*$b`

a*b:

val=`expr$b/$a`

b/a:

val=`expr$b%$a`

b%a:

if[$a==$b]

then

echo"

aisequaltob"

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

当前位置:首页 > 外语学习 > 法语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1