Linux的shell编程.ppt

上传人:za****8 文档编号:16080958 上传时间:2020-09-17 格式:PPT 页数:134 大小:269.02KB
返回 下载 相关 举报
Linux的shell编程.ppt_第1页
第1页 / 共134页
Linux的shell编程.ppt_第2页
第2页 / 共134页
Linux的shell编程.ppt_第3页
第3页 / 共134页
点击查看更多>>
资源描述
第5章Linux的shell编程,5.1什么是shell,当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shell(外壳)的程序。 shell就是一个命令行解释器。 一般的Linux系统都将bash作为默认的shell。,5.2几种流行的shell,目前流行的shell有ash、bash、ksh、csh、zsh等, bash是Linux系统默认使用的shell。可以用下面的命令来查看shell的类型: #echo $SHELL SHELL是一个环境变量,它记录用户所使用的shell类型。,几种流行的shell(续),可以用命令: #shell-name 来转换到别的shell $exit 退出子shell。,5.3 shell程序设计,使用shell编程类似于DOS中的批处理文件,称为shell script,又叫shell程序或shell命令文件或者shell脚本。 Shell脚本程序是按行来解释的,脚本程序总是以 #!/bin/sh 开始的,符号#!用来告诉系统它后面的参数是用来执行该文件的程序。,如果要执行该脚本,还必须使其可执行。 chmod +x filename 然后,您可以通过输入: ./filename 来执行您的脚本。,$ cat firstscript.sh #!/bin/sh echo “You are welcome to use base.” echo “Current work directory is $PWD.” echo “You are $LOGNAME.” 增加执行权限 $chmod +x firstscript.sh 开始运行程序: $./firstscript.sh,执行结果:,You are welcome to use base. Current work directory is /root You are root.,shell只有字符型变量。 shell变量无需初始化,一个没有初始化的shell变量自动被初始化为一个空串。 shell变量名大小写敏感。,5.4 shell基础编程,5.4.1 shell变量,Bourne Shell有如下四种变量: 本地变量(用户自定义变量 ) 位置变量即 shell script之参数 预定义变量(特殊变量) 环境变量(参考shell定制部分),shell变量(续),5.4.1.1本地变量(用户自定义变量),本地变量在用户现在的shell生命期的脚本中使用。 要设置一本地变量,格式为: $ variable-name=value 或 $ variable-name=value 因为大部分LINUX命令使用小写字符,因此在shell编程中变量通常全部大写。 变量的引用:在变量前加$ 。,(1)显示变量,使用echo命令输出单个变量的值,此时要在变量名前加$ $ WEEK=Satur $ echo Today is $WEEKday,输出:Today is,使用花括号来告诉shell我们要显示的变量: $ echo Today is $WEEKday 输出:Today is Saturday,(2)清除变量:,使用unset命令删除变量的赋值 $ Z=hello $ echo $Z hello $ unset Z $ echo $Z $,(3)显示所有本地shell变量:,使用set命令显示所有本地定义的shell变量,(4)结合变量值,Echo $variable-name1$variable-name2 $A=Hello, $B=World $echo $A$B Hello,World,(5)设置变量的默认值,Bourne Shell允许对变量设置默认值,其格式如下: $variable:-defaultvalue $color=blue $echo The sky is $color:-grey today,输出结果:The sky is blue today,$color=blue $unset color $echo The sky is $color:-grey today The sky is grey today $echo $color $,改变变量的值,格式如下:,$variable:=value $color=blue $unset color $echo The sky is $color:=grey today The sky is grey today $echo $color $ grey,(6)使用变量来保存系统命令参数,可以用变量保存系统命令参数的替换信息。 $ source= /etc/passwd $ cd $source,(7)设置只读变量,格式: variable-name=value readonly variable-name 查看所有只读变量,使用命令readonly,5.4.1.2 环境变量,环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。s h e l l中执行的用户进程均称为子进程。 环境变量应用于用户进程前,必须用export命令导出。,(1) 设置环境变量,VARIABLE-NAME=value;export VARIABLE-NAME 也可: VARIABLE-NAME=value export VARIABLE-NAME,环境变量(续),(2)显示环境变量 显示环境变量与显示本地变量一样。 使用env命令可以查看所有的环境变量。 (3) 清除环境变量 使用unset命令清除环境变量,(4)set命令,不带参数的set命令输出目前所有的shell变量(含用户自定义的变量)和它们的当前值。,(5) 将变量导出到子进程,$cat father #!/bin/sh #father script echo this is the father FILM=A Few Good Men echo I like the film :$FILM ./child #call the child script echo back to father echo and the film is :$FILM,将变量导出到子进程(续),$cat child #!/bin/sh #child script echo called from father.i am the child echo film is :$FILM FILM=Die Hard echo changing film to :$FILM,显示结果,this is the father I like the film :A Few Good Men called from father.i am the child film is : changing film to :Die Hard back to father and the film is :A Few Good Men,$cat father2 #!/bin/sh #father2 script echo this is the father FILM=A Few Good Men echo I like the film :$FILM #call the child script #but export varible first export FILM #在调用脚本前导出变量 ./child echo back to father echo and the film is :$FILM,输出结果$ ./father2,this is the father I like the film :A Few Good Men called from father.i am the child film is :A Few Good Men changing film to :Die Hard back to father and the film is :A Few Good Men,5.4.1.3 位置变量参数,如果要向一个shell脚本传递信息,可以使用位置参数完成此功能。参数相关数目传入脚本,此数目可以任意多,但只有前9个可以被访问,使用shift命令可以改变这个限制。 参数从第1个开始,在第9个结束;每个访问参数前要加$符号。第一个参数为0,表示预留保存实际脚本名字。,位置变量参数(续),如向脚本传送Did You See The Full Moon信息: $0 $1 $2 $3 $4 $5 $6 脚本名字 Did You See The Full Moon $7 $8 $9,(1) 在脚本中使用位置参数,$cat param #!/bin/sh #param echo This is the script name: $0 echo This is the first parameter: $1 echo This is the 2nd parameter : $2 echo This is the third parameter: $3 echo This is the 6th parameter : $6 echo This is the 7th parameter : $7,输出结果,执行:$ ./param Did You See The Full Moon,This is the script name : ./param This is the first parameter: Did This is the 2nd parameter : You This is the third parameter: See This is the 6th parameter : Moon This is the 7th parameter :,(2) 向系统命令传递参数,$cat findfile #!/bin/sh #findfile find / -name $1 print,5.4.1.4 预定义变量,预定义变量是在shell一开始时就定义了的变量,用户不能重定义它。所有预定义变量都是由$符和另一个符号组成的。 常用的预定义变量: $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个 $ 脚本运行的当前进程ID号,预定义变量(续),$! 后台运行的最后一个进程的进程ID号 $ 与$ #相同,但是使用时加引号,并在引号中返回每个参数 $- 显示shell使用的当前选项,与set命令功能相同 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。,(1) 最后的退出状态,$ cp ok.txt /tmp $ echo $? 0 $ cp ok.txt /usr/bin/aaa/bbb cp: cannot create regular file /usr/bin/aaa/bbb: No such file or directory $ echo $? 1,5.4.2条件测试,(1) 测试文件状态 t e s t一般有两种格式,即: test condition或 condition 使用方括号时,要注意在条件两边加上空格。,测试文件状态 (续),-r文件名:如果文件存在且可读则为真 -w文件名:如果文件存在且可写则为真 -x文件名:如果文件存在且可执行则为真 -s文件名:如果文件存在且至少有一个字符则为真 -d文件名:如果文件存在且为目录则为真 -f文件名:如果文件存在且为普通文件则为真 -e文件名:如果文件存在则为真 -c文件名:如果文件存在且为字符型特殊文件则为真 -b文件名:如果文件存在且为块特殊文件则为真,测试文件scores.txt 是否可写,$ls l scores.txt -rw-rr- 1 daveadmin 0 May 15 11:29 scores.txt $ -w scores.txt $echo $? 0 $test w scores.txt $echo $? 0,简单的算术运算,格式:$expression 例如:var1=2 var2=$var1*10+1 则:var2的值为21。,数值数据处理,Bash提供了3种方法对数值型数据进行算术运算: (1)使用let命令 (2)使用shell扩展$(expression) (3)使用expr命令,(1)let命令,语法:let express-list 功能:求出算术表达式的值 如果最后的表达式取值为0,则let命令返回1;否则返回0。 $let “a=8” “b=13” #命令中的表达式含空格,需加双引号 $let c=a+b,$echo “The value of c is $c.” The value of c is 21. $let “a *= b” $echo “The new value of a is $a; the product of a and b.” The new value of a is 104; the product of a and b.,Bash扩展,语法:$(expression) 功能:计算expression并返回它的值 $a=8 b=13 $echo “The new value of c is $(a+b) .” The new value of c is 21.,expr命令,语法:expr args 功能:计算args的值,并返回它的值到标准输出 $var1=10 $var1=expr $var1 + 1 $echo $var1 11,(2)测试时使用逻辑操作符号,Shell提供了三种逻辑操作完成两个文件状态比较的功能 -a 逻辑与 -o 逻辑或 ! 逻辑否 测试两个文件是否均可写 $ -w scores.txt a w results.txt $echo $? 0,(3)字符串测试,字符串测试共包含五种格式: test “string” test string_operator “string” test “string” string_operator “string” string_operator string string string_operator string ,String_operator 可以为:,=:两个字符串相等 !=:两个字符串不等 -z:空串 -n:非空串,比较两个字符串是否相等,$TAPE1=”/dev/rmt0” $TAPE2=”dev/rmt1” $ “$TAPE1” = “$TAPE2” $echo $? 1,(4)数值测试,格式: “number” numeric_operator “number” 或 “number” numeric_operator “number” ,numeric_operator一般为:,-eq:数值相等 -ne:数值不相等 -gt:大于 -lt:小于 -le:小于等于 -ge:大于等于,测试两个数是否相等,$NUMBER=130 $ “NUMBER” eq “130” $echo $? 0,测试两个表达式,$ “990” le “995” a “123” gt “33” $echo $? 0,5.4.3 控制流结构 (1)if 语句,if expression1 then command-list elif expression2 then then-command-list else else-command-list fi 在这里,一个expression是一系列命令。,也可采用如下格式:if expression1;then command-list elif expression2;then then-command-list else else-command-listfi,三种典型的if结构,第一种if语句: if expression then then-commands fi,第二种if语句: if expression then then-commands else else-commands fi,第3种if语句 if expression1 then then-commands elif expression2 then elif1-commands elif expression3 then elif2-commands else else-commands fi,例如:,$cat grade_evaluate.sh #!/bin/sh # Usage: ./grade_evaluate grade # grade should be between 0 and 100, including 0 and 100 if $1 lt 0 ; then echo Error: invalid grade elif $1 lt 60 ; then echo no pass,elif $1 lt 70 ; then echo pass elif $1 lt 80 ; then echo good elif $1 le 100 ; then echo excellent else echoError: invalid grade fi,(2)case 语句,格式: case test-string in 模式1) command-list1 ; 模式2) command-list2 ; *) command-listN+1 ; esac,case 语句(续),in 的每一模式必须以右括号)结束,取值可以为变量或常数,匹配发现string1取值符合某一模式后,其间所有命令开始执行直至;.如果模式1、模式2中没有和strings1相符合的,则星号(*)下面的语句被执行。模式匹配符*代表任意字符,?表示任意单个字符,.表示类或范围中任意字符。,$cat caseexample.sh #!/bin/sh echo n Do you want to continue this operation? n read yesno case $yesno in y | Y | Yes | yes) echo system will continue this operation ;,n | N | no | NO) echo system will skip this operation ; *) echo Incorrect input exit 1 ; esac,(3)for语句,有两种使用 for 语句的表达式: 第一种形式是: for var in list do commands done,第二种形式是:,for var do statements Done 使用这种形式时,变量var的取值是位置参数。,$cat simplefor.sh #!/bin/sh for i in 1 3 5 7 9 do echo $I done,(4)while和until循环,while循环的一般格式为: while expression do statements done,$cat whileexample.sh #!/bin/sh while read string do echo ”your string is $string” done echo Thank you, Bye!,#! /bin/bash #program test_while # count=1 while -n $* do echo This is parameter number $count $1 shift let count=count+1 done,until语句的格式为: until expression do commands done,#! /bin/bash #program test_until # count=1 until -z $* do echo This is parameter number $count $1 shift let count=count+1 done,$cat untilexample.sh #!/bin/sh until read string do echo ”your string is $string” done echo Thank you, Bye!,输出结果,$ your string is (程序继续) $abc Thank you, Bye!,Shell还提供了true和false两条命令用于建立无限循环结构的需要,它们的返回状态分别是总为0或总为非0,(5) break and continue,break 退出循环 $cat breakexample.sh #!/bin/sh while : do read string if $? != 0 ;then break fi done,$cat continueexample.sh #!/bin/sh for (i=0 ;i20 ;i=$i+1) do echo n $i if $i lt 10 ; then echo continue fi echo This is a two digital numeric done,5.4.4 shell 内嵌命令,shell 内嵌命令(续),shell 内嵌命令(内部命令)是由Bourne shell本身提供的,不是存在于/bin或usr/bin目录里。内部命令比系统里的相同命令执行得快。,eval,命令格式:eval args 功能:当shell程序执行到eval语句时,shell读入参数args,并将参数连接成一个新的命令让shell执行。 $eval expr 1 + 1 2 $echo $? 0,exec,命令格式:exec 命令 命令参数 功能:当shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程,也就是最初的shell就终止了,所以shell程序中exec后面的语句将不再被执行。 $exec ls -l #exec不会创建新的进程而是让l s -l 直接取代当前的shell 进程,export,命令格式:export变量名 或:export变量名=变量值 功能:shell用export把它的变量导出到子进程,但子进程不能用export把它的变量导出到父进程。 不带任何变量名的export语句将显示出当前所有的export变量。,readonly,命令格式:readonly变量名 功能:将一个用户定义的shell变量标识为只读。不带任何参数的readonly命令将显示出所有只读的shell变量。,pwd,显示当前当前目录,return,命令格式:return n 功能:退出函数并返回给定的值n。当n值缺省时,返回值是函数体内最后一个执行的命令的返回值。,exit,功能:退出shell程序。在exit之后可有选择地指定一个数字作为返回状态。,shift,命令格式:shift n 功能:重新分配命令行参数与位置参数的对应关系。在shift n以后,所有的S*中的参数会向左移动n个位置。同时$#会减n。默认的n为1。,set,功能:除了可以显示所有本地变量;还可以用于在脚本内部给出其运行参数,使得在脚本调试时不用重复输入参数。 $cat setexample.sh #!/bin/sh set fist second while $# !=0 do echo $1 shift done,执行结果,./setexample.sh first second,times,显示shell运行过程的用户和系统时间。 $times ls -l 0m0.010s 0m0.030s 0m0.510s 0m0.090s,wait,功能:等待直到一个用户子进程完成。可以在wait命令中指定进程ID号;如果未指定,则等待直到所有子进程完成。 $wait,“.”(点),命令格式:. Shell程序文件名 功能:使shell读入指定的shell程序文件并依次执行文件中的所有语句。,5.4.5 shell 函数,函数定义的基本格式为: functionname( ) 若干命令行 调用函数的格式为: functionname param1 param2,5.4.5 shell 函数(续),在函数定义时不用带参数说明,但在调用函数时可以带有参数,此时函数将会把这些参数视为位置参数,分别赋予$1、$2、.及$*。 $cat function.sh #!/bin/sh hello() echo “Hello,world” ,运行,$ . function.sh $hello Hello,world,也可以这样处理:,$cat function.sh #!/bin/sh hello() echo “Hello,world” hello,运行,$./function.sh 或者. function.sh,5.4.6 shell 输入与输出,(1)echo 功能:在屏幕上显示出由arg指定的字符串。输出的字符串间以空格隔开,并在最后加上换行符。 命令格式:echo-n-e字符串 或echo-help-version,echo选项,-n不要在最后自动换行 -e若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出: a发出警告声; b删除前一个字符; c最后不加上换行符号; f换行但光标仍旧停留在原来的位置; n换行且光标移至行首; r光标移至行首,但不换行;,t插入tab; v与f相同; 插入字符; nnn插入nnn(八进制)所代表的ASCII字符;,echo选项,-help显示帮助 -version显示版本信息,$cat echoexample.sh #!/bin/sh echo n Please input name: read name echo n Please input sex: read sex echo n please input age: read age echo n Please input second name: read name2 echo n Please input second sex: read sex2 echo n please input second age: read age2,echo -e “nnThis is a student list” echo n Name echo e -n ”ttSex” echo e “ttAge” echo e “$namett$sextt$age” echo e “$name2tt$sex2tt$age2”,(2)read,命令格式:read 变量名列表 功能:从键盘或文件输入数据,赋值给变量。shell用空格作为变量之间的分割符。 按回车键或者CTRL+D结束输入。 当read从文件中读取数据时候是按照行读取的,即一次读取一行。如果没有碰到回车符,则一直读到文件末尾。读取数据的方式和从键盘输入时相同。,read(续),$read name sex age Yangailin male 25 $echo $name Yangailin $echo $sex male $echo $age 25,read(续),$read name sex Yangailin male 25 $echo $name Yangailin $echo $sex male 25,从文件中读取数据,$cat read_from_file.sh #!/bin/sh while read LINE; do #do可以另起一行,此时 #LINE后面的分号可有可无 echo $LINE #在标准输出上显示文件的内容 echo $LINE /path/WRITE_FILE.TXT #WRITE_FILE.TXT是写入数据的文件名 done /path/READ_FILE.TXT# READ_FILE.TXT是要从中读取数据的文件名,(3)管道pipe,可以通过管道将一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示,它的语法格式如下: 命令1 | 命令2,管道pipe(续),$cat read_from_file2.sh #!/bin/sh cat READ_FILE while read LINE; # READ_FILE.TXT是要从中读取数据的文件名 do#文件应该带上路径 echo $LINE #在标准输出上显示文件的内容 echo $LINE /path/WRITE_FILE.TXT #WRITE_FILE.TXT是写入数据的文件名 done,(4)cat 命令,cat 命令可以用来显示文件内容,创建文件,还可以用来显示控制符号(用-v选项)。 cat命令一下子显示整个完整的文件。 如果希望每次显示一页,可以使用more命令 $ cat filename $more filename,连接文件,$cat filename1 filename2 filename3 #该命令把两个文件连成一个文件filename3,输入文件,$ cat a.txt abc efg ,(5)tee,功能:tee命令从标准输入设备读取数据,将其内容输出到标准输出设备,同时将输出的一个副本保存成文件。 语法:tee-a-i-help-version文件 参数:-a附加到文件的后面,而非覆盖它。如果tee指令的文件已经存在,没有-a则会覆盖该文件的内容。有-a,数据会新增在该文件内容的最后面,而不会删除原先之内容。 -i忽略中断信号 -help在线帮助 -version显示版本信息,(6)文件重定向,在Linux中,每一个进程都有三个特殊的文件描述指针:标准输入(standard input,文件描述符为0)、标准输出(standard output,文件描述符为1)、标准错误输出(standard error,文件描述符为2)。 在Linux中,可以通过文件重定向指定命令的标准输入、标准输出和标准错误输出。在shell中,使用者可以利用“”和“”来进行输入输出重定向。,文件重定向(续),commandfilename:将标准输出重定向到文件filename。 command 1filename:将标准输出重定向到文件filename。 commandfilename:将标准输出重定向到文件filename(追加)。 commandfilename 2 command2,(1)命令排列(续),command1 & command2 上面的命令表示只有当 command1 正确运行完毕后,才执行 command2 。,command1 | command2,上面的命令表示只有当 command1 运行失败才会执行 command2 。,(2)命令的任务调度,在shell下面,一个新产生的进程可以通过用命令后面的符号“;”和“产生一个前台的进程,下一个命令须等该命令运行结束后才能输入。 command & 产生一个后台的进程,此进程在后台运行的同时,可以输入其他的命令。,(3)命令的替换,command1 $(command2) 除了$( ),还可以用后引号(backquote): command1 command2,5.5.2引用,(1)双引号 使用双引号可引用除字符$(美元符号)、(反引号)、(反斜线)外的任意字符或字符串。 (2)单引号 如果用单引号把字符串括起来,则单引号内字符串中的任何特殊字符的特殊含义均被屏蔽。,引用(续),(3)反引号 shell将反引号中的内容作为一个系统命令,并执行其内容。使用这种方法可以替换输出为一个变量。 $TIME=date $echo $TIME,(4)反斜线,如果一个字符有特殊含义,可以使用反斜线防止shell误解其含义,即屏蔽其特殊含义。 下述字符包含有特殊意义: & * + $ | ?,5.5.3命令分组,在shell中有两种命令分组的方法:“()”和“”,当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、当前工作目录等)的改变影响到下面语句的执行时,就应该把这些命令放在圆括弧中 用于将顺序执行的命令的输出结果用于另一个命令的输入(管道方式)。,5.5.4运行shell程序的方法,执行shell程序,有三种方法: (1)将shell程序作为sh命令的输入,具体如下: # sh first.sh,运行shell程序的方法(续),(2)利用输入重定向 # bashfirst.sh (3)使用chmod命令使first.sh成为可执行的,然后直接执行。 # chmod a+x first.sh # first.sh,5.5.5 bash程序的调试,shell程序的调试主要是利用bash命令解释程序的选择项。调用bash的形式是: bash -选择项 shell程序文件名,几个常用的选择项,-e:如果一个命令失败就立即退出 -n:读入命令但是不执行它们 -u:置换时把未设置的变量看作出错 -v:当读入shell输入行时把它们显示出来 -x:执行命令时把命令和它们的参数显示出来,(1)未置变量退出和立即退出,未置变量退出:如果引用了一个未赋值的变量就终止shell程序的执行。未置变量退出选择项为“-u”。 要想在错误发生时使shell程序立即结束,可以使用“-e”选项。,(2)shell程序的跟踪,调试shell程序的主要方法是利用shell命令解释程序的“-v”或“-x”选项来跟踪程序的执行。“-v”选择项使shell在执行程序的过程中,把它读入的每一个命令行都显示出来,而“-x”选择项使shell在执行程序的过程中把它执行的每一个命令在行首用一个“+”加上命令名显示出来。并把每一个变量和该变量所取的值也显示出来。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!