shell及脚本设计《C语言程序设计》shell及脚本设计Shell脚本的运行shell脚本基础Shell流程控制Shell脚本的特殊符号编辑工具《C语言程序设计》shell及脚本设计Shell脚本的运行《C语言程序设计》shell脚本的执行Shell脚本执行方法:设置脚本的执行权限,直接执行脚本使用Bash内部指令“source“(或’.’)直接使用bash命令来执行方法三$bashwhoson方法二:$sourcewhoson$.whoson$catwhosondateechoUsersCurrentlyLoggedInwhoBashonly《C语言程序设计》直接执行目录错误执行权限错误增加权限并执行$./whosonbash:./whoson:Permissiondenied$chmodu+xwhoson$./whoson$whosonbash:whoson:commandnotfound《C语言程序设计》shell及脚本设计shell脚本基础《C语言程序设计》建立脚本Shell脚本程序的开始首先应指明使用哪种Shell来解释所写的脚本,一般来说Bash脚本以“#!”开头(文件的首行),而“#!”后面同时要将所使用Shell的路径明确指出,比如BourneShell的路径为/bin/sh,而CShell的路径则为/bin/csh为了增加程序的可读性,Shell脚本语句也可以像高级语言那样加注释,在Bash脚本程序中从“#”号开始到行尾的部分均被看作是程序的注释语句。$catbash_script#!/bin/bashechoThisisaBourneAgainShellscript.《C语言程序设计》Shell变量Shell脚本中主要有以下几种变量:系统变量,环境变量,用户变量。系统变量常用于参数判断和命令返回值判断;环境变量主要是在程序运行时的设置;用户变量在编程过程中使用频繁;《C语言程序设计》Shell系统变量$#:程序命令行参数的数目。$?:前一个命令的返回值。$*:以($1$2…)的形式保存所有输入的命令行参数。$@:以($1$2…)的形式保存所有输入的命令行参数。$0:当前程序名。$n:$1为命令行的第一个参数,$1为命令行的第二个参数,依次类推。《C语言程序设计》例echoargumentnumber:$#echopreviousreturn:$?echocommand:$*echocommand:$@echoname:$0《C语言程序设计》Shell环境变量Shell环境变量是所有Shell程序都会接受的参数。常用的Shell环境变量如下。PATH:决定了Shell将到哪些目录中寻找命令或程序。HOME:当前用户主目录的完全路径名。HISTSIZE:历史记录数。LOGNAME:当前用户的登录名。HOSTNAME:指主机的名称。SHELL:Shell路径名。LANGUGE:语言相关的环境变量,多语言可以修改此环境变量。MAIL:当前用户的邮件存放目录。PS1:主提示符,默认时root用户是#,普通用户是$。PS2:辅助提示符,默认时是“”。TERM:终端的类型。PWD:当前工作目录的绝对路径名。《C语言程序设计》Shell用户变量Shell用户变量是最常使用的变量,可以使用任何不包含空格字符的字串来当做变量名称,用赋值符号(=)为变量赋值:变量的引用,要在变量前加$变量名=变量值PATH=/binecho$PATH《C语言程序设计》变量引用无法准确识别变量名时,应使用{}进行界定$PREF=counter$WAY=$PREFclockwise$FAKE=$PREFfeit$echo$WAY$FAKE$$PREF=counter$WAY=${PREF}clockwise$FAKE=${PREF}feit$echo$WAY$FAKEcounterclockwisecounterfeit此时,WAY和FAKE均为空《C语言程序设计》shell及脚本设计Shell流程控制《C语言程序设计》条件执行主要有2种不同形式的条件语句:if语句case语句if[expression]thencommands1elsecommands2ficase字符串in模式1)command;;模式2)command;;……esac[[expression]]和testexpression或[expression]基本相同。注意brackets([])必须用空格分隔表达式《C语言程序设计》条件判断条件判断[][[]]test三种方式基本相同,注意以上三种均是语句,同一行中后接其它命令需用;隔开。另外[]与变量之间应用whitespace分隔。if[[$a==$b]];thenfiif[$a==$b];thenfiiftest$a==$b;thenfi《C语言程序设计》流程控制--条件语句(Conditionals)if/then语句1:#!/bin/bash2:a=13:b=24:if[[$a-eq$b]]5:then6:echoequal7:else8:echounequal9:fiif[[$a-eq$b]];thenechoequalelseechounequalfi《C语言程序设计》elif1:#!/bin/bash2:x=53:y=84:if[[$x-lt$y]]5:then6:echo$x$y7:elif[[$x-gt$y]]8:then9:echo$x$y10:elif[[$x-eq$y]]11:then12:echo$x==$y13:fiif[$x-lt$y]或iftest$x-lt$y《C语言程序设计》case语句(casecommand)1:#!/bin/bash2:var=23:4:case$varin5:0)echoThevalueis0;;6:1)echo”Thevalueis1“;;7:2)echo”Thevalueis2“;;8:*)echo”Thevalueisnot0,1,or2“9:esac注意:每个项均用;;结束注意:条件项的顺序对结果有影响。《C语言程序设计》测试范围(testranges)1:#!/bin/bash2:var=23:4:case$varin5:[0-5])echoThevalueisbetween0and5;;6:[6-9])echoThevalueisbetween6and9;;7:*)echoIt’ssomethingelse...8:esac《C语言程序设计》字符测试(testcharacters)1:#!/bin/bash2:3:char=f4:5:case$charin6:[a-zA-z])echoAncharacter;;7:[0-9])echoAnumber;;8:*)echoSomethingelse;;9:esac《C语言程序设计》字串测试(teststring)1:#!/bin/bash2:3:name=Tim4:5:case$namein6:Dan)echoIt’sDan.;;7:Marc|Tim)echoIt’sme.;;8:Ronald)echoIt’sRonald.;;9:*)echoIdon’tknowyou.;;10:esac《C语言程序设计》循环语句whileexpressiondocommand……donefor变量名[in列表]docommand1command2……done《C语言程序设计》while循环(whileLoops)1:#!/bin/bash2:3:var=14:5:while[$var-le5]6:do7:echovaris$var8:letvar=$var+19:done《C语言程序设计》for循环(forLoops)echo-n表示不换行1:#!/bin/bash2:3:echoCountingfrom1to54:5:forvalin123456:do7:echo-n$val8:done9:echo《C语言程序设计》字串范围(stringrange)1:#!/bin/bash2:3:echo-n“Thefirstfourplanetsare“4:forplanetinmercuryvenusearthmars;do5:echo-n“$planet“6:done7:echo《C语言程序设计》类似于C语言的for循环1:#!/bin/bash2:3:for((var=1;var=5;var++))4:do5:echo-n$var6:done7:echo《C语言程序设计》shell及脚本设计Shell脚本的特殊符号《C语言程序设计》引用符号(Quoting)CharacterMeaning;Commandseparator&Backgroundexecution()Commandgrouping|Pipe&Redirectionsymbols?[]~+-@!Filenamemetacharacters'\Usedinquotingothercharacters`Commandsubstitution$Variablesubstitution(orcommandorarithmeticsubstitution)spacetabnewlineWordseparators《C语言程序设计》文件通配符(FilenameMetacharacters)CharactersMeaning*Matchanystringofzeroormorecharacters.?Matchanysinglecharacter.[abc...]Matchanyoneoftheenclosedcharacters;ahyphencanspecifyarange(e.g.,a-z,A-Z,0-9).[!abc...]Matchanycharacternotenclosedasabove.~Homedirectoryofthecurrentuser.~nameHomedirectoryofusername.~+Currentworkingdirectory($PWD).~-Previousworkingdirectory($OLDPWD).ls[ts]*以t或s开头的文件ls[!ts]*不以t或s开头的文件lstest{10,3}.shtest10.sh和test3.sh《C语言程序设计》变量相关引用变量时必须使用$符号$person=alex$echopersonperson$echo$personalex$echo$personalex$echo$personalex“”中的变量将替换,‘’中的变量不替换。\表示转义$echo'$person'$person$echo\$person$person《C语言程序设计》引用$echo'Singlequotesprotectdoublequotes'Singlequotesprotectdoublequotes$echoWell,isn'tthat\special\?Well,isn'tthatspecial?$echoThevalueof\$xis$xThevalueof$xis100《C语言程序设计》引用命令执行的结果backticks的功能是执行其包含的语句,得到其结果$()$c=`date`$echo$cMonNov222:35:09EST2009$$c=$(date)$echo$cMonNov222:35:09EST2009$POSIX$echoYouhave`ls|wc-l`filesin`pwd`Youhave43filesin/home/bob《C语言程序设计》数学表达式(mathevaluations)在shell中有时会需进行数学运算,但下面的表达式无法实现数学表达式求值有三种方法使用let命令。使用((expr))形式,也可为变量赋