计算机硬件及网络Linux的shell编程课件_第1页
计算机硬件及网络Linux的shell编程课件_第2页
计算机硬件及网络Linux的shell编程课件_第3页
计算机硬件及网络Linux的shell编程课件_第4页
计算机硬件及网络Linux的shell编程课件_第5页
已阅读5页,还剩263页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章Linux的shell编程

第5章Linux的shell编程15.1什么是shell

当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shell(外壳)的程序。shell就是一个命令行解释器。一般的Linux系统都将bash作为默认的shell。

5.1什么是shell当一个用户登录Linux系统之后,系25.2几种流行的shell目前流行的shell有ash、bash、ksh、csh、zsh等,bash是Linux系统默认使用的shell。可以用下面的命令来查看shell的类型:#echo$SHELLSHELL是一个环境变量,它记录用户所使用的shell类型。5.2几种流行的shell目前流行的shell有ash、ba3几种流行的shell(续)可以用命令:#shell-name来转换到别的shell$exit退出子shell。几种流行的shell(续)可以用命令:45.3shell程序设计

使用shell编程类似于DOS中的批处理文件,称为shellscript,又叫shell程序或shell命令文件或者shell脚本。Shell脚本程序是按行来解释的,脚本程序总是以#!/bin/sh开始的,符号#!用来告诉系统它后面的参数是用来执行该文件的程序。5.3shell程序设计使用shell编程类似于DOS中5如果要执行该脚本,还必须使其可执行。chmod+xfilename然后,您可以通过输入:./filename来执行您的脚本。如果要执行该脚本,还必须使其可执行。6$catfirstscript.sh#!/bin/shecho“Youarewelcometousebase.”echo“Currentworkdirectoryis$PWD.”echo“Youare$LOGNAME.”增加执行权限$chmod+xfirstscript.sh开始运行程序:$./firstscript.sh$catfirstscript.sh7执行结果:

Youarewelcometousebase.Currentworkdirectoryis/rootYouareroot.

执行结果:Youarewelcometouseb8shell只有字符型变量。shell变量无需初始化,一个没有初始化的shell变量自动被初始化为一个空串。shell变量名大小写敏感。5.4shell基础编程5.4.1shell变量shell只有字符型变量。5.4shell基础编程5.4.9BourneShell有如下四种变量:

本地变量(用户自定义变量

位置变量即

shellscript之参数

预定义变量(特殊变量)环境变量(参考shell定制部分)shell变量(续)BourneShell有如下四种变量:shell变量(续105.4.1.1本地变量(用户自定义变量)

本地变量在用户现在的shell生命期的脚本中使用。

要设置一本地变量,格式为:

$variable-name=value或${variable-name=value}

因为大部分LINUX命令使用小写字符,因此在shell编程中变量通常全部大写。

变量的引用:在变量前加$。5.4.1.1本地变量(用户自定义变量)本地变量在用户现在11(1)显示变量

使用echo命令输出单个变量的值,此时要在变量名前加$

$WEEK=Satur$echoTodayis$WEEKday输出:Todayis使用花括号来告诉shell我们要显示的变量:$echoTodayis${WEEK}day输出:TodayisSaturday(1)显示变量使用echo命令输出单个变量的值,此时要在变12(2)清除变量:使用unset命令删除变量的赋值$Z=hello$echo$Zhello$unsetZ$echo$Z

$(2)清除变量:使用unset命令删除变量的赋值13(3)显示所有本地shell变量:

使用set命令显示所有本地定义的shell变量(3)显示所有本地shell变量:使用set命令显示所有本14(4)结合变量值

Echo${variable-name1}${variable-name2}$A=’Hello,’$B=’World’$echo${A}${B}Hello,World(4)结合变量值Echo${variable-name115(5)设置变量的默认值

BourneShell允许对变量设置默认值,其格式如下:

${variable:-defaultvalue}

$color=blue$echo"Theskyis${color:-grey}today"输出结果:Theskyisbluetoday

(5)设置变量的默认值BourneShell允许对变量设16$color=blue$unsetcolor$echo"Theskyis${color:-grey}today"Theskyisgreytoday$echo${color}$$color=blue17改变变量的值,格式如下:${variable:=value}$color=blue$unsetcolor$echo"Theskyis${color:=grey}today"Theskyisgreytoday$echo${color}$grey改变变量的值,格式如下:18(6)使用变量来保存系统命令参数

可以用变量保存系统命令参数的替换信息。$source=’/etc/passwd’$cd$source

(6)使用变量来保存系统命令参数可以用变量保存系统命令参数19(7)设置只读变量

格式:variable-name=valuereadonlyvariable-name

查看所有只读变量,使用命令readonly(7)设置只读变量格式:205.4.1.2环境变量

环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。shell中执行的用户进程均称为子进程。环境变量应用于用户进程前,必须用export命令导出。5.4.1.2环境变量环境变量用于所有用户进程(经常称为21(1)设置环境变量

VARIABLE-NAME=value;exportVARIABLE-NAME也可:VARIABLE-NAME=valueexportVARIABLE-NAME(1)设置环境变量VARIABLE-NAME=value22环境变量(续)(2)显示环境变量显示环境变量与显示本地变量一样。使用env命令可以查看所有的环境变量。(3)清除环境变量使用unset命令清除环境变量环境变量(续)(2)显示环境变量23(4)set命令

不带参数的set命令输出目前所有的shell变量(含用户自定义的变量)和它们的当前值。(4)set命令不带参数的set命令输出目前所有的shel24(5)将变量导出到子进程

$catfather#!/bin/sh#fatherscriptecho"thisisthefather"FILM="AFewGoodMen"echo"Ilikethefilm:$FILM"./child#callthechildscriptecho"backtofather"echo"andthefilmis:$FILM"

(5)将变量导出到子进程$catfather25将变量导出到子进程(续)$catchild#!/bin/sh#childscriptecho"calledfromfather..iamthechild"echo"filmis:$FILM"FILM="DieHard"echo"changingfilmto:$FILM"

将变量导出到子进程(续)$catchild26显示结果thisisthefatherIlikethefilm:AFewGoodMencalledfromfather..iamthechildfilmis:changingfilmto:DieHardbacktofatherandthefilmis:AFewGoodMen

显示结果thisisthefather27$catfather2#!/bin/sh#father2scriptecho"thisisthefather"FILM="AFewGoodMen"echo"Ilikethefilm:$FILM"#callthechildscript#butexportvariblefirstexportFILM#在调用脚本前导出变量./childecho"backtofather"echo"andthefilmis:$FILM"$catfather228输出结果$./father2thisisthefatherIlikethefilm:AFewGoodMencalledfromfather..iamthechildfilmis:AFewGoodMenchangingfilmto:DieHardbacktofatherandthefilmis:AFewGoodMen

输出结果$./father2thisisthefat295.4.1.3

位置变量参数

如果要向一个shell脚本传递信息,可以使用位置参数完成此功能。参数相关数目传入脚本,此数目可以任意多,但只有前9个可以被访问,使用shift命令可以改变这个限制。参数从第1个开始,在第9个结束;每个访问参数前要加$符号。第一个参数为0,表示预留保存实际脚本名字。5.4.1.3位置变量参数如果要向一个shell脚本传30位置变量参数(续)如向脚本传送DidYouSeeTheFullMoon信息:$0

$1

$2

$3

$4

$5

$6

脚本名字

Did

You

See

The

Full

Moon

$7

$8

$9位置变量参数(续)如向脚本传送DidYouSeeThe31(1)在脚本中使用位置参数

$catparam#!/bin/sh#paramecho"Thisisthescriptname

:$0"echo"Thisisthefirstparameter:$1"echo"Thisisthe2ndparameter

:$2"echo"Thisisthethirdparameter:$3"

echo"Thisisthe6thparameter

:$6"echo"Thisisthe7thparameter

:$7"

(1)在脚本中使用位置参数$catparam32输出结果执行:$./paramDidYouSeeTheFullMoon

Thisisthescriptname

:./paramThisisthefirstparameter:DidThisisthe2ndparameter

:YouThisisthethirdparameter:SeeThisisthe6thparameter

:MoonThisisthe7thparameter

:输出结果执行:$./paramDidYouSeeT33(2)向系统命令传递参数

$catfindfile#!/bin/sh#findfilefind/-name$1–print

(2)向系统命令传递参数$catfindfile345.4.1.4预定义变量

预定义变量是在shell一开始时就定义了的变量,用户不能重定义它。所有预定义变量都是由$符和另一个符号组成的。常用的预定义变量:$#传递到脚本的参数个数$*以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个$$脚本运行的当前进程ID号

5.4.1.4预定义变量预定义变量是在shell一开始35预定义变量(续)$!后台运行的最后一个进程的进程ID号$@与$#相同,但是使用时加引号,并在引号中返回每个参数$-显示shell使用的当前选项,与set命令功能相同$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。预定义变量(续)$!后台运行的最后一个进程的进程ID号36(1)最后的退出状态

$cpok.txt/tmp$echo$?0$cpok.txt/usr/bin/aaa/bbbcp:cannotcreateregularfile'/usr/bin/aaa/bbb':Nosuchfileordirectory$echo$?1(1)最后的退出状态$cpok.txt/tm375.4.2条件测试

(1)测试文件状态test一般有两种格式,即:testcondition 或[condition]使用方括号时,要注意在条件两边加上空格。

5.4.2条件测试(1)测试文件状态38测试文件状态(续)-r文件名:如果文件存在且可读则为真-w文件名:如果文件存在且可写则为真-x文件名:如果文件存在且可执行则为真-s文件名:如果文件存在且至少有一个字符则为真-d文件名:如果文件存在且为目录则为真-f文件名:如果文件存在且为普通文件则为真-e文件名:如果文件存在则为真-c文件名:如果文件存在且为字符型特殊文件则为真-b文件名:如果文件存在且为块特殊文件则为真测试文件状态(续)-r文件名:如果文件存在且可读则为真39测试文件scores.txt是否可写

$ls–lscores.txt-rw-r—r--1dave admin 0May1511:29scores.txt$[-wscores.txt]$echo$?0$test–wscores.txt$echo$?0测试文件scores.txt是否可写$ls–lsco40简单的算术运算

格式:$[expression]

例如:var1=2var2=$[var1*10+1]

则:var2的值为21。

简单的算术运算格式:$[expression]41数值数据处理Bash提供了3种方法对数值型数据进行算术运算:(1)使用let命令(2)使用shell扩展$((expression))(3)使用expr命令数值数据处理Bash提供了3种方法对数值型数据进行算术运算:42(1)let命令语法:letexpress-list功能:求出算术表达式的值如果最后的表达式取值为0,则let命令返回1;否则返回0。$let“a=8”“b=13”#命令中的表达式含空格,需加双引号$letc=a+b(1)let命令语法:letexpress-list43$echo“Thevalueofcis$c.”Thevalueofcis21.$let“a*=b”$echo“Thenewvalueofais$a;theproductofaandb.”Thenewvalueofais104;theproductofaandb.$echo“Thevalueofcis$c.”44Bash扩展语法:$((expression))功能:计算expression并返回它的值$a=8b=13$echo“Thenewvalueofcis$((a+b)).”Thenewvalueofcis21.Bash扩展语法:$((expression))45expr命令语法:exprargs功能:计算args的值,并返回它的值到标准输出$var1=10$var1=‘expr$var1+1’$echo$var111expr命令语法:exprargs46(2)测试时使用逻辑操作符号

Shell提供了三种逻辑操作完成两个文件状态比较的功能-a逻辑与-o逻辑或!逻辑否测试两个文件是否均可写$[-wscores.txt–a–wresults.txt]$echo$?0(2)测试时使用逻辑操作符号Shell提供了三种逻辑操作完47(3)字符串测试

字符串测试共包含五种格式:test“string”teststring_operator“string”test“string”string_operator“string”[string_operatorstring][stringstring_operatorstring]

(3)字符串测试字符串测试共包含五种格式:48String_operator可以为:=:两个字符串相等!=:两个字符串不等-z:空串-n:非空串

String_operator可以为:=:两个字符串相等49比较两个字符串是否相等

$TAPE1=”/dev/rmt0”$TAPE2=”dev/rmt1”$[“$TAPE1”=“$TAPE2”]$echo$?1

比较两个字符串是否相等$TAPE1=”/dev/rmt0”50(4)数值测试

格式:“number”numeric_operator“number”或[“number”numeric_operator“number”]

(4)数值测试格式:51numeric_operator一般为:-eq:数值相等-ne:数值不相等-gt:大于-lt:小于-le:小于等于-ge:大于等于

numeric_operator一般为:-eq:数值相等52测试两个数是否相等

$NUMBER=130$[“NUMBER”–eq“130”]$echo$?0测试两个数是否相等$NUMBER=13053测试两个表达式

$[“990”–le“995”–a“123”–gt“33”]$echo$?0测试两个表达式$[“990”–le“995”–a545.4.3控制流结构

(1)if语句

if[expression1]thencommand-list[elif[expression2]thenthen-command-list]…[elseelse-command-list]fi在这里,一个expression是一系列命令。5.4.3控制流结构

(1)if语句if[expr55也可采用如下格式:

if[expression1];then

command-list

[elif[expression2];then

then-command-list]

[else

else-command-list]

fi

也可采用如下格式:

if[expression1];the56三种典型的if结构第一种if语句:ifexpressionthenthen-commandsfi第二种if语句:ifexpressionthenthen-commandselseelse-commandsfi三种典型的if结构第一种if语句:第二种if语句:57第3种if语句ifexpression1thenthen-commandselifexpression2then

elif1-commandselifexpression3then

elif2-commands

…else

else-commandsfi第3种if语句58例如:$catgrade_evaluate.sh#!/bin/sh#Usage:./grade_evaluategrade#gradeshouldbebetween0and100,including0and100if[$1–lt'0'];then echo"Error:invalidgrade"elif[$1–lt'60'];then echo'nopass'例如:$catgrade_evaluate.sh59elif[$1–lt'70'];then echo"pass"elif[$1–lt'80'];then echo'good'elif[$1–le'100'];then echo'excellent'else echo'Error:invalidgrade'fielif[$1–lt'70'];then60(2)case语句

格式:casetest-stringin模式1)command-list1;;模式2)command-list2;;…*)command-listN+1;;esac

(2)case语句格式:61case语句(续)in的每一模式必须以右括号")"结束,取值可以为变量或常数,匹配发现string1取值符合某一模式后,其间所有命令开始执行直至;;.如果模式1、模式2中没有和strings1相符合的,则星号(*)下面的语句被执行。模式匹配符*代表任意字符,?表示任意单个字符,[..]表示类或范围中任意字符。

case语句(续)in的每一模式必须以右括号")"62$catcaseexample.sh#!/bin/shecho–n"Doyouwanttocontinuethisoperation?[n]"readyesnocase$yesnoiny|Y|Yes|yes) echo"systemwillcontinuethisoperation" ;;$catcaseexample.sh63n|N|no|NO) echo"systemwillskipthisoperation" ;;*) echo"Incorrectinput" exit1 ;;esacn|N|no|NO)64(3)for语句

有两种使用for语句的表达式:第一种形式是:forvarinlistdocommandsdone(3)for语句有两种使用for语句的表达式:65第二种形式是:forvardostatementsDone使用这种形式时,变量var的取值是位置参数。第二种形式是:forvar66$catsimplefor.sh#!/bin/shforiin13579doecho$Idone$catsimplefor.sh67(4)while和until循环

while循环的一般格式为:whileexpressiondostatementsdone(4)while和until循环while循环的一般格式为68$catwhileexample.sh#!/bin/shwhilereadstringdoecho”yourstringis$string”doneecho'Thankyou,Bye!'

$catwhileexample.sh69#!/bin/bash#programtest_while#count=1while[-n"$*"]doecho"Thisisparameternumber$count$1"shiftletcount=count+1done

#!/bin/bash70until语句的格式为:untilexpressiondocommandsdoneuntil语句的格式为:71#!/bin/bash#programtest_until#count=1until[-z"$*"]doecho"Thisisparameternumber$count$1"shiftletcount=count+1done

#!/bin/bash72$catuntilexample.sh#!/bin/shuntilreadstringdoecho”yourstringis$string”doneecho'Thankyou,Bye!'

$catuntilexample.sh73输出结果$<ctrl+D>yourstringis(程序继续)$abcThankyou,Bye!输出结果$<ctrl+D>74Shell还提供了true和false两条命令用于建立无限循环结构的需要,它们的返回状态分别是总为0或总为非0

Shell还提供了true和false两条命令用于建立无限循75(5)

breakandcontinue

break

退出循环$catbreakexample.sh#!/bin/shwhile:do readstring if[$?!=0];then break fidone(5)

breakandcontinuebreak76$catcontinueexample.sh#!/bin/shfor((i=0;i<20;i=$i+1))do echo–n$i if[$i–lt10];then echo'' continue fi echo'Thisisatwodigitalnumeric'done$catcontinueexample.sh775.4.4shell内嵌命令

命令功能:

空,永远返回为true

.

从当前shell中执行操作

break

退出for、while、until或case语句

cd

改变当前目录

pwd

显示当前目录

5.4.4shell内嵌命令命令功能:空,永远返回为78continue

结束本次循环,进行下一次循环

echo

反馈信息到标准输出

eval

读取参数,执行结果命令

exec

执行命令替代shell,它不创建新的进程,而是用被执行的命令取代当前的shell进程

exit

退出当前shell

export

导出变量,使当前shell可利用它

read

从标准输入读取一行文本

readonly

使变量变成只读

return

退出函数并带有返回值

set

控制各种参数到标准输出的显示

continue结束本次循环,进行下一次循环echo反79shift

命令行参数向左偏移一个

test

评估条件表达式

times

显示shell运行过程的用户和系统时间

trap

当捕捉信号时运行指定命令

ulimit

显示或设置shell资源

umask

显示或设置默认文件创建模式

unset从shell内存中删除变量或函数wait

等到直到子进程运行完毕,报告终止

shift命令行参数向左偏移一个test评估条件表达式80shell内嵌命令(续)shell内嵌命令(内部命令)是由Bourneshell本身提供的,不是存在于/bin或usr/bin目录里。内部命令比系统里的相同命令执行得快。shell内嵌命令(续)shell内嵌命令(内部命令)是81eval

命令格式:evalargs功能:当shell程序执行到eval语句时,shell读入参数args,并将参数连接成一个新的命令让shell执行。$evalexpr1+12$echo$?0eval命令格式:evalargs82exec命令格式:exec命令命令参数功能:当shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程,也就是最初的shell就终止了,所以shell程序中exec后面的语句将不再被执行。$exec

ls

-l

#exec不会创建新的进程而是让ls

-l直接取代当前的shell进程

exec命令格式:exec命令命令参数83export

命令格式:export变量名或:export变量名=变量值

功能:shell用export把它的变量导出到子进程,但子进程不能用export把它的变量导出到父进程。不带任何变量名的export语句将显示出当前所有的export变量。

export命令格式:export变量名或:export84readonly

命令格式:readonly变量名功能:将一个用户定义的shell变量标识为只读。不带任何参数的readonly命令将显示出所有只读的shell变量。

readonly命令格式:readonly变量名85pwd

显示当前当前目录

pwd显示当前当前目录86return

命令格式:return[n]功能:退出函数并返回给定的值n。当n值缺省时,返回值是函数体内最后一个执行的命令的返回值。

return命令格式:return[n]87exit

功能:退出shell程序。在exit之后可有选择地指定一个数字作为返回状态。

exit

功能:退出shell程序。在exit之后可有选择地88shift

命令格式:shift[n]功能:重新分配命令行参数与位置参数的对应关系。在shiftn以后,所有的S*中的参数会向左移动n个位置。同时$#会减n。默认的n为1。shift命令格式:shift[n]89set

功能:除了可以显示所有本地变量;还可以用于在脚本内部给出其运行参数,使得在脚本调试时不用重复输入参数。$catsetexample.sh#!/bin/shsetfistsecondwhile[$#!=0]

doecho$1shiftdone

set功能:除了可以显示所有本地变量;还可以用于在脚本内部90执行结果./setexample.shfirstsecond

执行结果./setexample.sh91times

显示shell运行过程的用户和系统时间。$timesls-l0m0.010s0m0.030s0m0.510s0m0.090stimes显示shell运行过程的用户和系统时间。92wait

功能:等待直到一个用户子进程完成。可以在wait命令中指定进程ID号;如果未指定,则等待直到所有子进程完成。$waitwait功能:等待直到一个用户子进程完成。可以在wait命93“.”(点)

命令格式:.Shell程序文件名功能:使shell读入指定的shell程序文件并依次执行文件中的所有语句。

“.”(点)命令格式:.Shell程序文件名945.4.5shell函数

函数定义的基本格式为:

functionname(){

若干命令行}调用函数的格式为:

functionnameparam1param2……5.4.5shell函数函数定义的基本格式为:955.4.5shell函数(续)在函数定义时不用带参数说明,但在调用函数时可以带有参数,此时函数将会把这些参数视为位置参数,分别赋予$1、$2、...及$*。

$catfunction.sh#!/bin/shhello(){echo“Hello,world”}5.4.5shell函数(续)在函数定义时不用带参数说明96运行$.function.sh

$helloHello,world

运行$.function.sh97也可以这样处理:$catfunction.sh#!/bin/shhello(){echo“Hello,world”}hello

也可以这样处理:$catfunction.sh98运行$./function.sh或者.function.sh

运行$./function.sh995.4.6shell输入与输出

(1)echo

功能:在屏幕上显示出由arg指定的字符串。输出的字符串间以空格隔开,并在最后加上换行符。

命令格式:echo

[-n][-e][字符串]或

echo

[--help][--version]5.4.6shell输入与输出(1)echo100echo选项

-n

不要在最后自动换行-e

若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:

\a

发出警告声;\b

删除前一个字符;

\c

最后不加上换行符号;

\f

换行但光标仍旧停留在原来的位置;

\n

换行且光标移至行首;

\r

光标移至行首,但不换行;

echo选项-n

不要在最后自动换行101

\t

插入tab;\v

与\f相同;

\\

插入\字符;

\nnn

插入nnn(八进制)所代表的ASCII字符;

\t

插入tab;102echo选项

--help

显示帮助

--version

显示版本信息

echo选项

--help

显示帮助103$catechoexample.sh#!/bin/shecho–n'Pleaseinputname:'readnameecho–n'Pleaseinputsex:'readsexecho–n'pleaseinputage:'readageecho–n'Pleaseinputsecondname:'readname2echo–n'Pleaseinputsecondsex:'readsex2echo–n'pleaseinputsecondage:'readage2

$catechoexample.sh104echo-e“\n\nThisisastudentlist”echo–n‘Name’echo–e-n”\t\tSex”echo–e“\t\tAge”echo–e“${name}\t\t${sex}\t\t${age}”echo–e“${name2}\t\t${sex2}\t\t${age2}”

echo-e“\n\nThisisastudent105(2)read

命令格式:read变量名列表功能:从键盘或文件输入数据,赋值给变量。shell用空格作为变量之间的分割符。按回车键或者CTRL+D结束输入。当read从文件中读取数据时候是按照行读取的,即一次读取一行。如果没有碰到回车符,则一直读到文件末尾。读取数据的方式和从键盘输入时相同。

(2)read命令格式:read变量名列表106read(续)$readnamesexageYangailinmale25$echo$nameYangailin$echo$sexmale$echo$age25read(续)$readnamesexage107read(续)$readnamesexYangailinmale25$echo$nameYangailin$echo$sexmale25

read(续)$readnamesex108从文件中读取数据$catread_from_file.sh#!/bin/shwhilereadLINE;do#do可以另起一行,此时#LINE后面的分号可有可无echo$LINE#在标准输出上显示文件的内容echo$LINE>>/path/WRITE_FILE.TXT#WRITE_FILE.TXT是写入数据的文件名done</path/READ_FILE.TXT #READ_FILE.TXT是要从中读取数据的文件名

从文件中读取数据$catread_from_file.sh109(3)管道pipe

可以通过管道将一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示,它的语法格式如下:命令1|命令2(3)管道pipe可以通过管道将一个命令的输出传递给另一个110管道pipe(续)$catread_from_file2.sh#!/bin/shcatREAD_FILEwhilereadLINE;#READ_FILE.TXT是要从中读取数据的文件名do #文件应该带上路径echo$LINE#在标准输出上显示文件的内容echo$LINE>>/path/WRITE_FILE.TXT#WRITE_FILE.TXT是写入数据的文件名done管道pipe(续)$catread_from_file2.111(4)cat命令

cat命令可以用来显示文件内容,创建文件,还可以用来显示控制符号(用-v选项)。

cat命令一下子显示整个完整的文件。如果希望每次显示一页,可以使用more命令$catfilename$morefilename(4)cat命令cat命令可以用来显示文件内容,创建文112连接文件$catfilename1filename2>filename3#该命令把两个文件连成一个文件filename3连接文件$catfilename1filename2113输入文件$cat>a.txtabcefg<ctrl+D>输入文件$cat>a.txt114(5)tee

功能:tee命令从标准输入设备读取数据,将其内容输出到标准输出设备,同时将输出的一个副本保存成文件。语

法:tee

[-a][-i][--help][--version][文件…]参

数:-a

附加到文件的后面,而非覆盖它。如果tee指令的文件已经存在,没有-a则会覆盖该文件的内容。有-a,数据会新增在该文件内容的最后面,而不会删除原先之内容。-i

忽略中断信号--help

在线帮助--version

显示版本信息(5)tee功能:tee命令从标准输入设备读取数据,将其内115(6)文件重定向

在Linux中,每一个进程都有三个特殊的文件描述指针:标准输入(standardinput,文件描述符为0)、标准输出(standardoutput,文件描述符为1)、标准错误输出(standarderror,文件描述符为2)。在Linux中,可以通过文件重定向指定命令的标准输入、标准输出和标准错误输出。在shell中,使用者可以利用“>”和“<”来进行输入输出重定向。

(6)文件重定向在Linux中,每一个进程都有三个特殊的文116文件重定向(续)command>filename:将标准输出重定向到文件filename。command1>filename:将标准输出重定向到文件filename。command>>filename:将标准输出重定向到文件filename(追加)。command>filename2>&1将标准输出和标准错误输出一起重定向到文件filename。command2>filename:将标准错误输出重定向到文件filename。command2>>filename:将标准错误输出重定向到文件filename(追加)。

文件重定向(续)command>filename:将标准输出117文件重定向(续)command>>filename2>&1将标准输出和标准错误输出一起重定向到文件filename中(追加)。command<filename>filename2:让command命令以文件filename为标准输入,以文件filename2为标准输出。command<filename:让command命令以文件filename为标准输入。command<<delimiter:让command命令以标准输入作为输入,直到遇到delimiter分界符。

文件重定向(续)command>>filename2>&1118文件重定向(续)command<&m:把文件描述符m作为标准输入。command>&m:把标准输出重定向到文件描述符m中。command<&-:关闭标准输入。

文件重定向(续)command<&m:把文件描述符m作为标准1195.5shell高级编程

5.5.1命令排列、调度与替换

(1)命令排列shell允许用户在不同的命令之间,放上特殊的排列字符。用户如果需要在一行中给出多个命令需使用分号“;”。command1;command2

5.5shell高级编程

5.5.1命令排列、调度与替换120(1)命令排列(续)command1&&command2上面的命令表示只有当command1正确运行完毕后,才执行command2。

(1)命令排列(续)command1&&command2121command1||command2

上面的命令表示只有当command1运行失败才会执行command2。

command1||command2上面的命令表示只有122(2)命令的任务调度

在shell下面,一个新产生的进程可以通过用命令后面的符号“;”和“&”来分别以前台和后台的方式来执行,语法如下:

command;

产生一个前台的进程,下一个命令须等该命令运行结束后才能输入。command&

产生一个后台的进程,此进程在后台运行的同时,可以输入其他的命令。

(2)命令的任务调度在shell下面,一个新产生的进程可以123(3)命令的替换

command1$(command2)除了'$()',还可以用后引号(backquote):command1`command2`

(3)命令的替换command1$(command2)1245.5.2引用

(1)双引号使用双引号可引用除字符$(美元符号)、`(反引号)、\(反斜线)外的任意字符或字符串。

(2)单引号如果用单引号把字符串括起来,则单引号内字符串中的任何特殊字符的特殊含义均被屏蔽。

5.5.2引用(1)双引号125引用(续)(3)反引号shell将反引号中的内容作为一个系统命令,并执行其内容。使用这种方法可以替换输出为一个变量。$TIME=’date’$echo$TIME引用(续)(3)反引号126(4)反斜线如果一个字符有特殊含义,可以使用反斜线防止shell误解其含义,即屏蔽其特殊含义。下述字符包含有特殊意义:

&

*

+

^

$

`

"

|

?

(4)反斜线如果一个字符有特殊含义,可以使用反斜线防止s1275.5.3命令分组

在shell中有两种命令分组的方法:“()”和“{}”,当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、当前工作目录等)的改变影响到下面语句的执行时,就应该把这些命令放在圆括弧中{}用于将顺序执行的命令的输出结果用于另一个命令的输入(管道方式)。5.5.3命令分组在shell中有两种命令分组的方法:“(1285.5.4运行shell程序的方法

执行shell程序,有三种方法:(1)将shell程序作为sh命令的输入,具体如下:

#shfirst.sh

5.5.4运行shell程序的方法执行shell程序,有三129运行shell程序的方法(续)(2)利用输入重定向#bash<first.sh

(3)使用chmod命令使first.sh成为可执行的,然后直接执行。

#chmoda+xfirst.sh#first.sh

运行shell程序的方法(续)(2)利用输入重定向1305.5.5bash程序的调试

shell程序的调试主要是利用bash命令解释程序的选择项。调用bash的形式是:

bash-选择项shell程序文件名5.5.5bash程序的调试shell程序的调试主要是利131几个常用的选择项-e:如果一个命令失败就立即退出-n:读入命令但是不执行它们-u:置换时把未设置的变量看作出错-v:当读入shell输入行时把它们显示出来-x:执行命令时把命令和它们的参数显示出来

几个常用的选择项-e:如果一个命令失败就立即退出132(1)未置变量退出和立即退出

未置变量退出:如果引用了一个未赋值的变量就终止shell程序的执行。。未置变量退出选择项为“-u”。要想在错误发生时使shell程序立即结束,可以使用“-e”选项。

(1)未置变量退出和立即退出未置变量退出:如果引用了一个未133(2)shell程序的跟踪

调试shell程序的主要方法是利用shell命令解释程序的“-v”或“-x”选项来跟踪程序的执行。“-v”选择项使shell在执行程序的过程中,把它读入的每一个命令行都显示出来,而“-x”选择项使shell在执行程序的过程中把它执行的每一个命令在行首用一个“+”加上命令名显示出来。并把每一个变量和该变量所取的值也显示出来。

(2)shell程序的跟踪调试shell程序的主要方法是134第5章Linux的shell编程

第5章Linux的shell编程1355.1什么是shell

当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shell(外壳)的程序。shell就是一个命令行解释器。一般的Linux系统都将bash作为默认的shell。

5.1什么是shell当一个用户登录Linux系统之后,系1365.2几种流行的shell目前流行的shell有ash、bash、ksh、csh、zsh等,bash是Linux系统默认使用的shell。可以用下面的命令来查看shell的类型:#echo$SHELLSHELL是一个环境变量,它记录用户所使用的shell类型。5.2几种流行的shell目前流行的shell有ash、ba137几种流行的shell(续)可以用命令:#shell-name来转换到别的shell$exit退出子shell。几种流行的shell(续)可以用命令:1385.3shell程序设计

使用shell编程类似于DOS中的批处理文件,称为shellscript,又叫shell程序或shell命令文件或者shell脚本。Shell脚本程序是按行来解释的,脚本程序总是以#!/bin/sh开始的,符号#!用来告诉系统它后面的参数是用来执行该文件的程序。5.3shell程序设计使用shell编程类似于DOS中139如果要执行该脚本,还必须使其可执行。chmod+xfilename然后,您可以通过输入:./filename来执行您的脚本。如果要执行该脚本,还必须使其可执行。140$catfirstscript.sh#!/bin/shecho“Youarewelcometousebase.”echo“Currentworkdirectoryis$PWD.”echo“Youare$LOGNAME.”增加执行权限$chmod+xfirstscript.sh开始运行程序:$./firstscript.sh$catfirstscript.sh141执行结果:

Youarewelcometousebase.Currentworkdirectoryis/rootYouareroot.

执行结果:Youarewelcometouseb142shell只有字符型变量。shell变量无需初始化,一个没有初始化的shell变量自动被初始化为一个空串。shell变量名大小写敏感。5.4shell基础编程5.4.1shell变量shell只有字符型变量。5.4shell基础编程5.4.143BourneShell有如下四种变量:

本地变量(用户自定义变量

位置变量即

shellscript之参数

预定义变量(特殊变量)环境变量(参考shell定制部分)shell变量(续)BourneShell有如下四种变量:shell变量(续1445.4.1.1本地变量(用户自定义变量)

本地变量在用户现在的shell生命期的脚本中使用。

要设置一本地变量,格式为:

$variable-name=value或${variable-name=value}

因为大部分LINUX命令使用小写字符,因此在shell编程中变量通常全部大写。

变量的引用:在变量前加$。5.4.1.1本地变量(用户自定义变量)本地变量在用户现在145(1)显示变量

使用echo命令输出单个变量的值,此时要在变量名前加$

$WEEK=Satur$echoTodayis$WEEKday输出:Todayis使用花括号来告诉shell我们要显示的变量:$echoTodayis${WEEK}day输出:TodayisSaturday(1)显示变量使用echo命令输出单个变量的值,此时要在变146(2)清除变量:使用unset命令删除变量的赋值$Z=hello$echo$Zhello$unsetZ$echo$Z

$(2)清除变量:使用unset命令删除变量的赋值147(3)显示所有本地shell变量:

使用set命令显示所有本地定义的shell变量(3)显示所有本地shell变量:使用set命令显示所有本148(4)结合变量值

Echo${variable-name1}${variable-name2}$A=’Hello,’$B=’World’$echo${A}${B}Hello,World(4)结合变量值Echo${variable-name1149(5)设置变量的默认值

BourneShell允许对变量设置默认值,其格式如下:

${variable:-defaultvalue}

$color=blue$echo"Theskyis${color:-grey}today"输出结果:Theskyisbluetoday

(5)设置变量的默认值BourneShell允许对变量设150$color=blue$unsetcolor$echo"Theskyis${color:-grey}today"Theskyisgreytoday$echo${color}$$color=blue151改变变量的值,格式如下:${variable:=value}$color=blue$unsetcolor$echo"Theskyis${color:=grey}today"Theskyisgreytoday$echo${color}$grey改变变量的值,格式如下:152(6)使用变量来保存系统命令参数

可以用变量保存系统命令参数的替换信息。$source=’/etc/passwd’$cd$source

(6)使用变量来保存系统命令参数可以用变量保存系统命令参数153(7)设置只读变量

格式:variable-name=valuereadonlyvariable-name

查看所有只读变量,使用命令readonly(7)设置只读变量格式:1545.4.1.2环境变量

环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。shell中执行的用户进程均称为子进程。环境变量应用于用户进程前,必须用export命令导出。5.4.1.2环境变量环境变量用于所有用户进程(经常称为155(1)设置环境变量

VARIABLE-NAME=value;exportVARIABLE-NAME也可:VARIABLE-NAME=valueexportVARIABLE-NAME(1)设置环境变量VARIABLE-NAME=value156环境变量(续)(2)显示环境变量显示环境变量与显示本地变量一样。使用env命令可以查看所有的环境变量。(3)清除环境变量使用unset命令清除环境变量环境变量(续)(2)显示环境变量157(4)set命令

不带参数的set命令输出目前所有的shell变量(含用户自定义的变量)和它们的当前值。(4)set命令不带参数的set命令输出目前所有的shel158(5)将变量导出到子进程

$catfather#!/bin/sh#fatherscriptecho"thisisthefather"FILM="AFewGoodMen"echo"Ilikethefilm:$FILM"./child#callthechildscriptecho"backtofather"echo"andthefilmis:$FILM"

(5)将变量导出到子进程$catfather159将变量导出到子进程(续)$catchild#!/bin/sh#childscriptecho"calledfromfather..iamthechild"echo"filmis:$FILM"FILM="DieHard"echo"changingfilmto:$FILM"

将变量导出到子进程(续)$catchild160显示结果thisisthefatherIlikethefilm:AFewGoodMencalledfromfather..iamthechildfilmis:changingfilmto:DieHardbacktofatherandthefilmis:AFewGoodMen

显示结果thisisthefather161$catfather2#!/bin/sh#father2scriptecho"thisisthefather"FILM="AFewGoodMen"echo"Ilikethefilm:$FILM"#callthechildscript#butexportvariblefirstexportFILM#在调用脚本前导出变量./childecho"backtofather"echo"andthefilmis:$FILM"$catfather2162输出结果$./father2thisisthefatherIlikethefilm:AFewGoodMencalledfromfather..iamthechildfilmis:AFewGoodMenchangingfilmto:DieHardbacktofatherandthefilmis:AFewGoodMen

输出结果$./father2thisisthefat1635.4.1.3

位置变量参数

如果要向一个shell脚本传递信息,可以使用位置参数完成此功能。参数相关数目传入脚本,此数目可以任意多,但只有前9个可以被访问,使用shift命令可以改变这个限制。参数从第1个开始,在第9个结束;每个访问参数前要加$符号。第一个参数为0,表示预留保存实际脚本名字。5.4.1.3位置变量参数如果要向一个shell脚本传164位置变量参数(续)如向脚本传送DidYouSeeTheFullMoon信息:$0

$1

$2

$3

$4

$5

$6

脚本名字

Did

You

See

The

Full

Moon

$7

$8

$9位置变量参数(续)如向脚本传送DidYouSeeThe165(1)在脚本中使用位置参数

$catparam#!/bin/sh#paramecho"Thisisthescriptname

:$0"echo"Thisisthefirstparameter:$1"echo"Thisisthe2ndparameter

:$2"echo"Thisisthethirdparameter:$3"

echo"Thisisthe6thparameter

:$6"echo"Thisisthe7thparameter

:$7"

(1)在脚本中使用位置参数$catparam166输出结果执行:$./paramDidYouSeeTheFullMoon

Thisisthescriptname

:./paramThisisthefirstparameter:DidThisisthe2ndparameter

:YouThisisthethirdparameter:SeeThisisthe6thparameter

:MoonThisisthe7thparameter

:输出结果执行:$./paramDidYouSeeT167(2)向系统命令传递参数

$catfindfile#!/bin/sh#findfilefind/-name$1–print

(2)向系统命令传递参数$catfindfile1685.4.1.4预定义变量

预定义变量是在shell一开始时就定义了的变量,用户不能重定义它。所有预定义变量都是由$符和另一个符号组成的。常用的预定义变量:$#传递到脚本的参数个数$*以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个$$脚本运行的当前进程ID号

5.4.1.4预定义变量预定义变量是在shell一开始169预定义变量(续)$!后台运行的最后一个进程的进程ID号$@与$#相同,但是使用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论