shell编程-总结.ppt
第第 7 7 章章 LinuxLinux中的中的shellshell编程编程1 1知识要点知识要点1.Shell1.Shell编程介绍编程介绍2.2.变量、表达式变量、表达式3.3.流程控制流程控制|函数函数|数组数组第第 7 7 章章 LinuxLinux中的中的shellshell编程编程2 21.Shell脚本基本结构脚本基本结构#!/bin/bash#脚本必须以脚本必须以#!开始开始#!表示:表示:/bin/bash将执行该脚本文件中的程序将执行该脚本文件中的程序#表示此后的字符串为注释表示此后的字符串为注释脚本支持:变量、表达式、流程控制、函数、注释脚本支持:变量、表达式、流程控制、函数、注释 各种外部命令和程序调用、命令行参数、系统变量各种外部命令和程序调用、命令行参数、系统变量等等。等等。脚本就是将上述各种元素通过一定的逻辑关系进脚本就是将上述各种元素通过一定的逻辑关系进行组装已完成特定任务的程序。行组装已完成特定任务的程序。第第 7 7 章章 LinuxLinux中的中的shellshell编程编程3 31.Shell脚本及运行脚本及运行step1.利用利用vi编辑如下脚本并保存成编辑如下脚本并保存成first.sh#!/bin/bashecho“Hello,welcome to Linux world”echo“Today is:$(date)”Step2.设置执行权限:设置执行权限:chmod u+x first.shStep3.执行脚本执行脚本:./first.sh 或或 sh first.sh 或或 bash first.sh第第 7 7 章章 LinuxLinux中的中的shellshell编程编程4 42.Shell变量及表达式变量及表达式 -变量类型变量类型A.环境变量环境变量(系统工作环境需要的全局变量系统工作环境需要的全局变量)$PATH,$BASH,$HOME,$PWD,$TERM,$PWDB.自定义变量自定义变量(仅在脚本中使用局部变量仅在脚本中使用局部变量)语法格式:语法格式:变量名变量名=变量值变量值#变量名约定大写变量名约定大写例如:例如:A=10;echo$A SA=“hello Linux”;echo$SAC.只读变量只读变量 readonly 变量名变量名D.导出局部变量导出局部变量 export 变量名变量名 或者或者 export 变量名变量名=变量值变量值E.函数中的同名局部变量函数中的同名局部变量:local 变量名变量名=变量值变量值第第 7 7 章章 LinuxLinux中的中的shellshell编程编程5 52.Shell变量及表达式变量及表达式 -注意问题注意问题几个注意问题:几个注意问题:A.变量指向一个字符串变量指向一个字符串(含有空格含有空格),则变量值必须,则变量值必须使用双引号括起来。例如:使用双引号括起来。例如:SA=“Hello Linux”B.引用时变量前加引用时变量前加$,单引号和双引号的区别,单引号和双引号的区别 echo Oh$SA$SA;echo“Oh$SA$SA”C.清除不需要的变量:清除不需要的变量:unset 变量名变量名 如:如:unset SA第第 7 7 章章 LinuxLinux中的中的shellshell编程编程6 62.Shell变量及表达式变量及表达式-位置参数位置参数(程序的参数程序的参数)何为位置参数?分析如下的命令调用何为位置参数?分析如下的命令调用cat /etc/passwd ;cp /root/a.c /home/me/b.c命令命令/程序程序引用方式引用方式:$0参数参数:引用方式引用方式$1 以此类推:以此类推:$0,$1,$2$*:表示所有位置参数表示所有位置参数$#:表示位置参数的个数表示位置参数的个数$:同同$*第第9个以后的参数:个以后的参数:$10,$11 命令行中常用:命令行中常用:$?命令执行后返回的状态命令执行后返回的状态$!后台运行的最后一个进程号后台运行的最后一个进程号$当前进程号当前进程号第第 7 7 章章 LinuxLinux中的中的shellshell编程编程7 72.Shell变量及表达式变量及表达式-位置参数位置参数(程序的参数程序的参数)一个关于命令位置参数的脚本文件一个关于命令位置参数的脚本文件 arg.sh#!/bin/bashecho“完整的命令行完整的命令行:$0$*”echo“程序是:程序是:$0”echo“所有的参数:所有的参数:$*”echo“参数个数:参数个数:$#”if$#-ge 1;then echo“第第1个参数个参数:$1”fi问题:如果参数没输入,但程序中需要怎么办问题:如果参数没输入,但程序中需要怎么办?第第 7 7 章章 LinuxLinux中的中的shellshell编程编程8 82.Shell变量及表达式变量及表达式 缺省参数缺省参数(位置替换位置替换)比如脚本比如脚本 mycal.sh 5 6+;mycal.sh 5 6*如果没有输入如果没有输入+或者或者*,我能否默认取为,我能否默认取为+呢?而不是呢?而不是认为程序执行出错呢?认为程序执行出错呢?VAR=$参数参数-word :有则用参数,否则用有则用参数,否则用wordVAR=$参数参数=word :有则用参数有则用参数,否则两个用否则两个用wordVAR=$参数参数?word:有则用参数,否则报错退出有则用参数,否则报错退出VAR=$参数参数+word :有则用有则用word,否则不做,否则不做注意:上述四条经常用在位置参数的使用上。注意:上述四条经常用在位置参数的使用上。第第 7 7 章章 LinuxLinux中的中的shellshell编程编程9 92.Shell变量及表达式变量及表达式 缺省参数缺省参数(位置替换位置替换)脚本脚本 mycal.sh#!/bin/bashLEFT=$1-1#第第1个位置参数个位置参数,缺省为缺省为1RIGHT=$2-1#第第2个位置参数个位置参数,缺省为缺省为1FUHAO=$3-+#第第3个位置参数个位置参数,缺省为缺省为+case“$FUHAO”in+)RE=expr$LEFT+$RIGHT;-)RE=expr$LEFT-$RIGHT;esacecho“$LEFT$FUHAO$RIGHT=$RE”第第 7 7 章章 LinuxLinux中的中的shellshell编程编程10102.Shell变量表达式变量表达式 概述概述 Shell中的变量表达式主要利用各种测试语句、条中的变量表达式主要利用各种测试语句、条件来获得字符串、文件、数字等所处的状态。件来获得字符串、文件、数字等所处的状态。表达式的操作符主要包括:表达式的操作符主要包括:字符操作符:字符操作符:=,!=,-n,-z 数字操作符:数字操作符:-eq,-ne,-ge,-gt,-le,-lt =,!=,=,=,逻辑操作符:逻辑操作符:!,-a,-o 文件操作符:文件操作符:-d,-f,-L,-r,-w,-x,-s,-e,-z,-c,-b,-o 可以使用可以使用 test 命令来测试上述各种表达式状态。命令来测试上述各种表达式状态。第第 7 7 章章 LinuxLinux中的中的shellshell编程编程11112.Shell变量表达式变量表达式 概述概述字符串:字符串:A=abcd;test$A=abcd;echo$?A=“;test z$A;echo$?test n$A;echo$?test z“$A”;echo$?数字比较:数字比较:A=1234;test$A eq 1234;echo$?test$A gt 1000;echo$?逻辑比较逻辑比较:test -f/etc/passwd a s/etc/passwd test -d/root ;echo$?test!z/etc/passwd;echo$?第第 7 7 章章 LinuxLinux中的中的shellshell编程编程12123.Shell脚本流程控制脚本流程控制Shell支持的流程控制语句主要有:支持的流程控制语句主要有:分支语句:分支语句:if elif else fi,case esac循环语句:循环语句:for,while,until函数定义:函数定义:function funname()第第 7 7 章章 LinuxLinux中的中的shellshell编程编程13133.Shell脚本流程控制脚本流程控制分支语句分支语句if单分支单分支if 条件条件 then 语句语句 fi或者或者if 条件条件;then 语句语句 fi或者或者if(条件条件);then 语句语句 fi或者或者if(条件条件)then 语句语句 fi第第 7 7 章章 LinuxLinux中的中的shellshell编程编程14143.Shell脚本流程控制脚本流程控制分支语句分支语句if双分支双分支 if 条件条件 then 语句语句 else 语句语句 fi多分支多分支 if 条件条件;then 语句语句 elif 条件条件;then 语句语句 else 语句语句 fi注意:注意:条件条件 中,条件前后必须留有一个空格中,条件前后必须留有一个空格 ;then连在一起写,必须加上分号连在一起写,必须加上分号;第第 7 7 章章 LinuxLinux中的中的shellshell编程编程15153.Shell脚本流程控制脚本流程控制分支语句分支语句casecase 表达式表达式 in expr-1)命令命令1;expr-2)命令命令2;*)其他命令其他命令esacecho -n“Input A=“read A case$A in1)echo“select 11”;2)echo“seelct 22”;*)echo“select else”;esac第第 7 7 章章 LinuxLinux中的中的shellshell编程编程16163.Shell脚本流程控制脚本流程控制分支语句分支语句caseecho -n“Input A=“read A case$A in“fuzhou city”)echo“select 11”;“xiamen city”)echo“seelct 22”;*)echo“select else”;esac注意:如果是字符串变量且含有空格,则必注意:如果是字符串变量且含有空格,则必须在匹配位置加上引号,如须在匹配位置加上引号,如”fuzhou city”第第 7 7 章章 LinuxLinux中的中的shellshell编程编程17173.Shell脚本流程控制脚本流程控制分支语句分支语句(菜单式菜单式)OPTIONS=“fuzhou xiamen”select opt in$OPTIONS;do case“$opt”in fuzhou)echo“select fuzhou”;xiamen)echo“select xiamen”;*)exit ;esacdone注意:可能没有循环执行!注意:可能没有循环执行!第第 7 7 章章 LinuxLinux中的中的shellshell编程编程18183.Shell脚本流程控制脚本流程控制循环控制循环控制 forfor 变量变量 in 数值列表数值列表#for i in 1 2 3 4do#省略省略 则表示取编所有位置参数则表示取编所有位置参数 命令命令 donelen=10;#指定循环次数指定循环次数for (i=0;i“$len”;i=i+1)do 命令命令done例子:实现例子:实现1加到加到100sum=0for(i=1;i101;i=i+1)do let sum=sum+$idoneecho$sum第第 7 7 章章 LinuxLinux中的中的shellshell编程编程19193.Shell脚本流程控制脚本流程控制循环控制循环控制 whilewhile 条件命令为真条件命令为真do 命令命令done while:#无限循环无限循环do 命令命令done例子:实现例子:实现1加到加到100k=1sum=0while$k le 100 do let sum=$sum+$k let k+doneecho$sum第第 7 7 章章 LinuxLinux中的中的shellshell编程编程20203.Shell脚本流程控制脚本流程控制循环控制循环控制 untiluntil 条件命令为假条件命令为假do 命令命令done until:#无限循环无限循环do 命令命令done例子:实现例子:实现1加到加到100k=1sum=0until$k gt 100 do let sum=$sum+$k let k+doneecho$sum第第 7 7 章章 LinuxLinux中的中的shellshell编程编程21213.Shell脚本流程控制脚本流程控制循环控制循环控制 例子:实现例子:实现1加到加到100sumfor=0for(i=1;i=100;i+)do let sum=sum+$idoneecho$sumfori=1sum=0while($i100)dolet sum=$sum+$ilet i+donedcho$sumlet i+i=expr$i+1 i=$($i+1)let“i=$i+1”while$i le 100 while($i=100)第第 7 7 章章 LinuxLinux中的中的shellshell编程编程22223.Shell脚本流程控制脚本流程控制函数函数function funname()return 整数整数例例1:function sum()return$($1+$2)如果没有如果没有return则最后一则最后一条命令的返回值就是函数条命令的返回值就是函数的返回值。的返回值。funname()注意:注意:1函数必须先声明,才能函数必须先声明,才能调用调用2函数中的变量同全局变函数中的变量同全局变量名相同时,则量名相同时,则使用使用 local val=value定义局部变量定义局部变量3 无需无需(不能不能)定义参数定义参数 第第 7 7 章章 LinuxLinux中的中的shellshell编程编程23233.Shell脚本流程控制脚本流程控制函数函数#!/bin/bashgsum=0function sumn()sum=0 for(i=1;i=$1;i+)do let sum=$sum+$i done gsum=$sum return$sumsumn 10 echo“sum=$?”调用注意:调用注意:1 直接传递参数直接传递参数 如如 sumn 102 函数就是命令,返回函数就是命令,返回值只能通过值只能通过$?获取获取 如如 echo“sum=$?”3 如果需要返回变量值,如果需要返回变量值,则通过全局变量带回值则通过全局变量带回值 如如 gsum第第 7 7 章章 LinuxLinux中的中的shellshell编程编程24243.Shell脚本流程控制脚本流程控制函数函数#!/bin/bashgsum=0function sumn()local gsum=0 for(i=1;i=$1;i+)do let gsum=$gsum+$i done return$gsumsumn 10 echo“sum=$?”echo$gsum调用注意:调用注意:1 全局变量和局部变量全局变量和局部变量的使用区别的使用区别 如如gsum第第 7 7 章章 LinuxLinux中的中的shellshell编程编程25253.Shell脚本流程控制脚本流程控制数组数组1定义:定义:A=(元素列表,空格隔开元素列表,空格隔开)下标从下标从0开始开始 如如A=(a b c d)2数组长度数组长度$#A*3 引用第引用第i个元素个元素$A$i4 赋值赋值 A$i=value5 以字符串输出所有元素以字符串输出所有元素echo$A*6 循环输出所有元素循环输出所有元素Len=$#A*for(i=0;i$Len;i+)do echo$A$idone或者或者for value in$A*do echo$valuedone第第 7 7 章章 LinuxLinux中的中的shellshell编程编程26263.Shell脚本流程控制脚本流程控制序列函数序列函数seq生成从生成从1到到100的的100个元素的数组:个元素的数组:A=seq 100#seq 1 toB=seq 1 100#seq from to第第 7 7 章章 LinuxLinux中的中的shellshell编程编程2727细节问题细节问题1:整数的四则运算:整数的四则运算 A=10 B=20 C=expr$A+$B C=expr$A*$B D=$($A+$B)D=$($A*$B)D=$(A+B)D=$A+$B D=$A+B let E=A+B let E=A*B(F=A+B)(F=A*B)let A+(A+)let A+=10 (A+=10)(A*=10)注意:符号注意:符号()或或 中的变量可以不写引用符中的变量可以不写引用符$第第 7 7 章章 LinuxLinux中的中的shellshell编程编程2828细节问题细节问题2:字符串函数:字符串函数字符串字符串A=“HELL:LINUX:WORLD”1.获得字符串长度获得字符串长度 LEN=$#A2.提取提取6-10字符字符 SUB1=$A:5:5 结果结果 LINUX3.从第从第6个字符开始提取个字符开始提取 SUB2=$A:5 结果结果 LINUX:WORLD4.将符号将符号:替换为符号替换为符号/REP=$A/:/结果结果 HELL/LINUX/WORLD 将符号将符号:替换为替换为cc REP=$A/:/cc