您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > Shell脚本-从入门到精通
Linux操作系统Shell脚本编程主要内容和学习要求掌握创建shell脚本的基本步骤学会使用条件测试掌握if条件结构与case选择结构掌握for循环、while循环和until循环结构学会shift命令的使用学会shell脚本的调试Shell脚本Shell脚本如果有一系列你经常使用的Linux命令,你可以把它们存储在一个文件里,shell可以读取这个文件并顺序执行其中的命令,这样的文件被称为脚本文件。shell脚本按行解释。Shell脚本的编写Shell脚本是纯文本文件,可以使用任何文本编辑器编写Shell脚本通常是以.sh作为后缀名Shell脚本的执行chmod+xscript_name./script_namebashscript_name第一行:指定用哪个程序来编译和执行脚本。Shell脚本的格式#!/bin/bash可执行语句和shell控制结构注释:以“#”开头,可独占一行,或跟在语句的后面。Shell脚本#!/bin/sh#!/bin/csh一个shell脚本通常由一组Linux命令、shell命令、控制结构和注释语句构成。在脚本中多写注释语句是一个很好的编程习惯#!/bin/bash#ThisisthefirstBashshellprogram#ScriptName:greetings.shechoecho–eHello$LOGNAME,\cechoit'snicetalkingtoyou.echoYourpresentworkingdirectoryis:pwd#Showthenameofpresentdirectoryechoecho–eThetimeis`date+%T`!.\nByeechobashgreetings.shchmod+xgreetings.sh./greetingsShell脚本举例echo命令功能说明:显示文字。语法:echo[-ne][字符串]或echo[--help][--version]补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行号。-n不进行换行-e若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出\n换行\b空格...参数:-n不要在最后自动换行-e若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:\a发出警告声;\b删除前一个字符;\c最后不加上换行符号;\f换行但光标仍旧停留在原来的位置;\n换行且光标移至行首;\r光标移至行首,但不换行;\t插入tab;\v与\f相同;\\插入\字符;\nnn插入nnn(八进制)所代表的ASCII字符;--help显示帮助--version显示版本信息#!/bin/bash#Thisscriptistotesttheusageofread#Scriptname:ex4read.shecho===examplesfortestingread===echo-eWhatisyourname?\creadnameechoHello$nameechoecho-nWheredoyouwork?readechoIguess$REPLYkeepsyoubusy!echoread-pEnteryourjobtitle:#自动读给REPLYechoIthoughtyoumightbean$REPLY.echoecho===Endofthescript===Shell脚本举例read命令readvariable#读取变量给variablereadxy#可同时读取多个变量read#自动读给REPLYread–p“Pleaseinput:”#自动读给REPLY状态变量$?中保存命令退出状态的值grep$USER/etc/passwdecho$?grephello/etc/passwd;echo$?条件测试条件测试可以根据某个特定条件是否满足,来选择执行相应的任务。Bash中允许测试两种类型的条件:命令成功或失败,表达式为真或假任何一种测试中,都要有退出状态(返回值),退出状态为0表示命令成功或表达式为真,非0则表示命令失败或表达式为假。内置测试命令test通常用test命令来测试表达式的值x=5;y=10test$x-gt$yecho$?test命令可以用方括号来代替x=5;y=10[$x-gt$y]echo$?表达式测试包括字符串测试、整数测试和文件测试。测试表达式的值方括号前后要留空格!name=Tom[$name=[Tt]??]echo$?2.x版本以上的Bash中可以用双方括号来测试表达式的值,此时可以使用通配符进行模式匹配。测试表达式的值[[$name=[Tt]??]]echo$?字符串测试[-zstr]如果字符串str长度为0,返回真[-nstr]如果字符串str长度不为0,返回真[str1=str2]两字符串相等[str1!=str2]两字符串不等name=Tom;[-z$name];echo$?操作符两边必须留空格!字符串测试name2=Andy;[$name=$name2];echo$?整数测试,即比较大小[int1-eqint2]int1等于int2[int1-neint2]int1不等于int2[int1-gtint2]int1大于int2[int1-geint2]int1大于或等于int2[int1-ltint2]int1小于int2[int1-leint2]int1小于或等于int2x=1;[$x-eq1];echo$?x=a;[$x-eq1];echo$?整数测试操作符两边必须留空格!X整数测试也可以使用let命令或双圆括号x=1;let$x==1;echo$?x=1;(($x+1=2));echo$?只能用于整数测试!整数测试相应的操作符为:==、!=、、=、、=例:两种测试方法的区别使用的操作符不同let和双圆括号中可以使用算术表达式,而中括号不能let和双圆括号中,操作符两边可以不留空格逻辑测试[expr1-aexpr2]逻辑与,都为真时,结果为真[expr1-oexpr2]逻辑或,有一个为真时,结果为真[!expr]逻辑非x=1;name=Tom;[$x-eq1–a–n$name];echo$?逻辑测试注:不能随便添加括号[($x-eq1)–a(–n$name)];echo$?Xx=1;name=Tom;[[$x-eq1&&$name=To?]];echo$?[[pattern1&&pattern2]]逻辑与[[pattern1||pattern2]]逻辑或[[!pattern]]逻辑非可以使用模式的逻辑测试逻辑测试文件测试:文件是否存在,文件属性,访问权限等。-ffnamefname存在且是普通文件时,返回真(即返回0)-Lfnamefname存在且是链接文件时,返回真-dfnamefname存在且是一个目录时,返回真-efnamefname(文件或目录)存在时,返回真-sfnamefname存在且大小大于0时,返回真-rfnamefname(文件或目录)存在且可读时,返回真-wfnamefname(文件或目录)存在且可写时,返回真-xfnamefname(文件或目录)存在且可执行时,返回真常见的文件测试操作符更多文件测试符参见test的在线帮助mantest文件测试检查空值[$name=][!$name][X${name}!=X]检查空值语法结构ifexpr1#如果expr1为真(返回值为0)then#那么commands1#执行语句块commands1elifexpr2#若expr1不真,而expr2为真then#那么commands2#执行语句块commands2......#可以有多个elif语句else#else最多只能有一个commands4#执行语句块commands4fi#if语句必须以单词fi终止if条件语句commands为可执行语句块,如果为空,需使用shell提供的空命令“:”,即冒号。该命令不做任何事情,只返回一个退出状态0if语句可以嵌套使用ex4if.sh,chkperm.sh,chkperm2.sh,name_grep,tellme,tellme2,idcheck.sh几点说明elif可以有任意多个(0个或多个)else最多只能有一个(0个或1个)if语句必须以fi表示结束expr通常为条件测试表达式;也可以是多个命令,以最后一个命令的退出状态为条件值。ex4if.sh#!/bin/bash#scriptname:ex4if.sh#echo-nPleaseinputx,y:readxyechox=$x,y=$yif((xy));thenechoxislargerthanyelif((x==y));thenechoxisequaltoyelseechoxislessthanyfichkperm.sh#!/bin/bash#Usingtheoldstyletestcommand:[]#filename:perm_check.sh#file=testingif[-d$file]thenecho$fileisadirectoryelif[-f$file]thenif[-r$file-a-w$file-a-x$file]then#nestedifcommandechoYouhaveread,write,andexecutepermissionon$file.fielseecho$fileisneitherafilenoradirectory.fichkperm2.sh#!/bin/bash#Usingthenewstyletestcommand:[[]]#filename:perm_check2.sh#file=./testingif[[-d$file]]thenecho$fileisadirectoryelif[[-f$file]]thenif[[-r$file&&-w$file&&-x$file]]then#nestedifcommandechoYouhaveread,write,andexecutepermissionon$file.fielseecho$fileisneitherafilenoradirectory.finame_grep#!/bin/bash#filename:name_grep#name=Tomifgrep$name/etc/passwd&/dev/nullthen:elseecho$namenotfoundin/etc/passwdexit2fitellme#!/bin/bashecho-nHowoldareyou?readageif[$age-lt0-o$age-gt120]thenechoWelcometoourplanet!exit1fiif[$age-ge0-a$age-le12]thenechoChildrenistheflowersofthecountryelif[$age-gt12-a$age-le19]thenechoRebelwithoutacauseelif[$age-gt19-a$age-le29]thenechoYougottheworldbythetail!!elif[$age-ge30-a$age-le39]thenechoThirtysomething...elseechoSorryIaskedfitellme2#!/bin/bashecho-nHowoldareyou?readageif((age0||age120))thenechoWelcometoourplanet!exit1fiif((age=0&&age=12))thenechoChildrenistheflowersofthecountryelif((age=13&&age=19))thenechoRebelwithou
本文标题:Shell脚本-从入门到精通
链接地址:https://www.777doc.com/doc-2858384 .html