项目9 学习Shell脚本_第1页
项目9 学习Shell脚本_第2页
项目9 学习Shell脚本_第3页
项目9 学习Shell脚本_第4页
项目9 学习Shell脚本_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

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

文档简介

项目9学习Shell脚本任务1BashShell基础认识BashShell12Bash变量3通配符和特殊符号4重定向操作5Bash命令流6命令别名和历史记录1认识BashShell1认识BashShellShell位于操作系统内核外层,为用户提供一个与内核交互的操作环境通过Shell完成工作往往效率更高Shell兼容性较好,在不同的Linux发行版中使用方式相同自动化运维是学习Shell的重要原因什么是Shellwhere

there’sashell,there’saway1认识BashShellBourneShell:UNIX操作系统最初使用的ShellBash:Linux的默认Shell,是BourneShell的扩展和超集csh(CShell):BSDUNIX的默认Shell,已被tcsh取代ksh(KornShell):编程和交互功能优秀,许多系统安装脚本都使用ksh编写ZShell:Linux系统里最庞大的一种Shell,使用复杂,一般不使用常见的Shell1认识BashShell历史命令:保存执行过的命令,可以快速重复执行命令别名:将长命令简化为短命令,或用习惯用法代替命令和文件路径补全:通过Tab键快速输入命令名或路径名通配符:快速查找和处理文件管道和重定向:最常使用的操作之一Bash的主要功能和特性2Bash变量2Bash变量变量:用一个固定的字符串代表可能发生变化的内容包含变量名和变量值两个要素变量可以简化Shell脚本的编写,使Shell脚本更简洁也更易维护变量为进程间共享数据提供了一种新的手段Bash变量fname=/home/zys/tmp/file1变量名变量值两种形式:$var_name或${var_name}使用echo命令输出变量值读取变量值[zys@centos8~]$echo$SHELL //第1种方法,SHELL是一个环境变量/bin/bash <==这是SHELL变量的值[zys@centos8~]$echo${SHELL} //第2种方法/bin/bash[zys@centos8~]$echo${shell} //shell变量未定义

<==变量值为空[zys@centos8~]$两种方式有区别2Bash变量使用变量之前必须先定义一个变量并设置变量的值用“=”连接变量名和变量值:var_name=var_value设置变量值[zys@centos8~]$fname=/etc/os-release //定义fname变量并为其赋值[zys@centos8~]$echo$fname/etc/os-release[zys@centos8~]$fname=/etc/centos-release //修改fname变量的值[zys@centos8~]$echo$fname/etc/centos-release2Bash变量变量名由字母、数字和下划线组成,但首字符不能是数字设置变量值是,“=”左右不能直接连接空格变量值中有空格,可以使用双引号或单引号把变量值括起来设置变量的规则[zys@centos8~]$echo$SHELL/bin/bash[zys@centos8~]$myshell1="myshellis$SHELL"[zys@centos8~]$echo$myshell1myshellis/bin/bash <==代入SHELL变量的值[zys@centos8~]$myshell2='myshellis$SHELL'[zys@centos8~]$echo$myshell2myshellis$SHELL <==把“$SHELL”本身作为变量值单双引号意义不同2Bash变量用命令的执行结果为变量赋值:`command`或$(command)通过read命令将用户的键盘输入赋值给变量:readvar_name设置变量的规则(续)[zys@centos8~]$curdate=`date` //使用反单引号获取命令执行结果[zys@centos8~]$echo$curdate2024年02月28日星期三19:24:08CST[zys@centos8~]$curdate=$(date) //使用小括号获取命令执行结果[zys@centos8~]$echo$curdate2024年02月28日星期三19:24:19CST[zys@centos8~]$readfname //从键盘上获取变量fname的值/etc/os-release <==在键盘上输入这一行然后按Enter键[zys@centos8~]$echo$fname/etc/os-release2Bash变量使用declare命令修改变量的数据类型declare命令仅支持整数的数值运算设置变量的规则(续)[zys@centos8~]$declare-ivar=3*7 //将变量var声明为整数[zys@centos8~]$echo$var21[zys@centos8~]$var=8/5 //取整[zys@centos8~]$echo$var1[zys@centos8~]$var=2.3 //赋值为浮点数bash:2.3:语法错误:无效的算术运算符(错误符号是".3")2Bash变量使用unset取消或删除变量,在unset命令后跟变量名即可删除变量[zys@centos8~]$echo$myshellmyshellis/bin/bash[zys@centos8~]$unsetmyshell //删除变量[zys@centos8~]$echo$myshell <==变量已删除,值为空[zys@centos8~]$2Bash变量操作系统内置的变量在登录操作系统后就默认存在,多用于保存重要的系统参数环境变量可以被系统中所有的应用共享使用env和export命令查看系统当前的环境变量环境变量[zys@centos8~]$env //也可以使用export命令查看HOSTNAME=centos8SHELL=/bin/bashUSER=zysPATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/zys/binLANG=zh_CN.UTF-8HOME=/home/zys2Bash变量几个特殊的变量[zys@centos8~]$echo$$ //查看当前Bash进程的PID4985[zys@centos8~]$echo$?0 <==上一个命令(即echo$$)执行成功[zys@centos8~]$ls/etc/centos-release2ls:无法访问'/etc/centos-release2':没有那个文件或目录[zys@centos8~]$echo$?2 <==上一个命令(即lsfile11)执行异常[zys@centos8~]$echo$?0 <==上一个命令(即echo$?)执行成功

$$:查看当前Bash进程的PID

$?:返回上一个命令的执行结果,0表示成功,非0表示失败或异常2Bash变量变量的作用范围[zys@centos8~]$p_var="variableinparentprocess" //在父进程定义的变量[zys@centos8~]$bash //使用bash命令创建子进程[zys@centos8~]$echo$p_var //这里已经处于子进程的工作界面

<==子进程中没有p_var变量,所以输出为空[zys@centos8~]$exit //退出子进程exit[zys@centos8~]$ //返回父进程的工作界面一个Bash窗口对应一个Bash进程,执行的命令也都是(子)进程子进程运行时,父进程一般处于“睡眠”状态子进程执行完毕,父进程重新开始运行默认情况下子进程不会继承父进程定义的变量2Bash变量变量的作用范围(续)[zys@centos8~]$p_var="variableinparentprocess"[zys@centos8~]$exportp_var //允许子进程使用该变量[zys@centos8~]$bash[zys@centos8~]$echo$p_varvariableinparentprocess <==子进程继承了该变量[zys@centos8~]$exit使用export命令使子进程继承父进程的变量export命令是单向的,即父进程把变量传递给子进程后,如果在子进程中修改了变量值,那么修改后的变量值无法传递给父进程在新打开的Bash窗口中无法共享变量2Bash变量3通配符和特殊符号通配符用特定的符号对文件名进行模式匹配(patternmatching)用特定的符号表示文件名的某种模式遇到这些特定的符号,就用相应的模式对文件名进行扩展3通配符和特殊符号通配符-示例3通配符和特殊符号[zys@centos8tmp]$touchf1f2F1F2file1[zys@centos8tmp]$ls* //匹配任意文件f1F1f2F2file1[zys@centos8tmp]$lsf? //匹配以f开头,后跟一个字符的文件f1f2[zys@centos8tmp]$lsf* //匹配以f开头的所有文件f1f2file1[zys@centos8tmp]$ls[^f]* //匹配不以f开头的所有文件F1F2[zys@centos8tmp]$ls[fF]? //匹配以f或F开头,后跟一个字符的文件f1F1f2F2[zys@centos8tmp]$lsf[0-9] //匹配以f开头,后跟一个数字的文件f1f2特殊符号尽量避免使用特殊符号为文件命名3通配符和特殊符号4重定向操作重定向基本概念默认情况下,标准输入是键盘,标准输出是屏幕(即显示器)Linux命令从键盘获得输入,并把执行结果在屏幕中显示出来重定向:重新指定命令的输入和输出有输入重定向和输出重定向之分4重定向操作输出重定向-覆盖原文件[zys@centos8tmp]$pwd/home/zys/tmp <==执行结果默认显示在屏幕中[zys@centos8tmp]$pwd>pwd.result //将执行结果输出到文件pwd.result中[zys@centos8tmp]$catpwd.result

/home/zys/tmp在命令之后输入大于号“>”并且后跟一个文件名对原文件的内容进行了“覆盖”,即清空原文件内容4重定向操作输出重定向-追加新内容[zys@centos8tmp]$catpwd.result

/home/zys/tmp <==当前内容[zys@centos8tmp]$ls-lF*

-rw-r--r--.1zysdevteam02月2921:11F1-rw-r--r--.1zysdevteam02月2921:11F2[zys@centos8tmp]$ls-lF*>>pwd.result //将ls命令的结果追加到文件pwd.result中[zys@centos8tmp]$catpwd.result

/home/zys/tmp-rw-r--r--.1zysdevteam02月2921:11F1-rw-r--r--.1zysdevteam02月2921:11F2使用两个大于号“>>”实现“追加”的效果在原文件的基础上“追加”新内容4重定向操作输入重定向[zys@centos8tmp]$vimf1 //添加下面两行内容23+34 12*3[zys@centos8tmp]$bc<f2 //输入重定向:从文件f1中获得输入内容5736[zys@centos8tmp]$bc<f1>f2 //同时进行输入重定向和输出重定向[zys@centos8tmp]$catf25736将原来从键盘输入的数据改为从文件读取可以同时使用输入输出重定向4重定向操作5Bash命令流连续执行命令-命令间没有依赖关系[zys@centos8tmp]$clear;ls //依次执行clear和ls两条命令f1F1f2F2file1file2pwd.result命令间用分号“;”分隔,只要按一次Enter键,这些命令就会被依次执行适合于命令之间没有依赖关系的情况不管前一条命令成功或失败,后一条命令都会执行5Bash命令流连续执行命令-命令间有依赖关系[zys@centos8~]$cdbin&&touchfile1 //如果cd命令执行成功就接着执行touch命令-bash:cd:bin:没有那个文件或目录 <==cd命令执行失败[zys@centos8~]$cdbin||mkdirbin //如果cd命令执行失败就接着执行mkdir命令-bash:cd:bin:没有那个文件或目录 [zys@centos8~]$ls-ldbindrwxr-xr-x.2zysdevteam62月2921:31bin <==目录bin已创建命令间用“&&”或“||”连接用“$?”查看前一条命令执行结果5Bash命令流管道命令[zys@centos8~]$cat/etc/os-release|wc //wc命令把cat命令的输出作为输入

1317333[zys@centos8~]$cat/etc/os-release|wc|wc //连续使用两次管道命令

1324功能:一个命令的输出成为另一个命令的输入使用管道符号“|”连接两个命令,左侧命令的输出成为右侧命令的输入可以在一条命令中多次使用管道符号以实现更复杂的操作5Bash命令流命令别名功能:简化复杂的命令,或者以自己习惯的方式使用命令如果没有alias关键字,别名的设置和Bash变量几乎是相同的单独使用alias命令可以查看Bash当前已设置的别名使用别名还可以替换系统已有的命令在命令行中设置的命令别名只对当前Bash进程有效如果想删除已设置的命令别名,可以使用unalias命令5Bash命令流alias命令别名=’命令[选项][参数]’命令历史记录功能:保存命令行窗口中执行过的命令以便后续查找或执行命名保存在历史命令文件中,并且为每条命令分配唯一的编号使用history命令处理和历史命令相关的操作HISTSIZE变量指定history命令最多可以显示的命令条数,默认值是1000历史命令文件一般是~/.bash_history,由HISTFILE变量指定HISTFILESIZE变量指定历史命令文件最多可以保存的命令总数,默认值是10005Bash命令流命令历史记录(续)重复执行上一条命令在命令行中输入“!!”或“!-1”可以快速执行上一条命令“!-n”表示执行最近的第n条命令按【Ctrl+P】或键盘的向上方向键调出最近一条命令,按回车键执行通过命令编号执行历史命令使用“!n”可以快速执行编号为n的历史命令通过命令关键字执行历史命令使用“!cmd”可以查找最近一条以cmd开头的命令并执行通过【Ctrl+R】组合键搜索历史命令使用【Ctrl+R】组合键对历史命令进行搜索,按回车键即可执行5Bash命令流任务2正则表达式正则表达式概述12基础正则表达式1正则表达式概述1正则表达式概述管理员经常需要提取特定信息,或者对文件的内容进行查找、替换或删除操作正则表达式提高了系统管理员的工作效率和准确性正则表达式使用一系列符号对字符串进行模式匹配支持正则表达式的工具有很多,如grep、vim、sed、awk等验证数据的有效性替换文本内容从字符串中提取子字符串什么是正则表达式2基础正则表达式2基础正则表达式基础正则表达式-示例文件[zys@centos8tmp]$cat-nreg_file //正则表达式示例文件

1 Repeatthedoseafter12hoursifnecessary2 Shedozedoffinfrontofthefirewithher"cat"3 4 HehesitatedforthemerestfrActionofasecond,5 andhesaid:"ohhhhhhhhho,ithurtsme"直接查找特定的字符串如果字符串包含空格,可以将其包含在单引号或双引号中如果字符串中包含特殊字符,可以使用转义符“\”基础正则表达式-匹配普通字符串[zys@centos8tmp]$grep-ndosereg_file //匹配普通字符串1:Repeatthedoseafter12hoursifnecessary[zys@centos8tmp]$grep-n'forthe'reg_file //使用引号包含空格4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n\"cat\"reg_file //使用转义符2:Shedozedoffinfrontofthefirewithher"cat"2基础正则表达式在“[]”中包含一个或多个大写字母、小写字母或数字的任意组合正则表达式只会匹配其中的一个字符(英文字母和数字都是字符)基础正则表达式-匹配字符集合[zys@centos8tmp]$grep-n'do[sz]e'reg_file //匹配字符集合1:Repeatthedoseafter12hoursifnecessary2:Shedozedoffinfrontofthefirewithher"cat"[zys@centos8tmp]$grep-n'fr[oA][nc]t'reg_file //连续匹配字符集合2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,2基础正则表达式在“[]”中使用“-”表示某一范围的数字和字母“[a-z]”表示从a到z的任意一个小写字母“[A-Z]”表示从A到Z的任意一个大写字母“[0-9]”表示从0到9的任意一个数字基础正则表达式-匹配字符范围[zys@centos8tmp]$grep-n'fr[a-zA-Z][a-z]t'reg_file //连续匹配字符范围2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,2基础正则表达式“[-]”的有效性依赖于系统的语言设置可以使用特殊符号表示特定范围的字符基础正则表达式-特殊符号[zys@centos8tmp]$grep-n'[[:digit:]]'reg_file1:Repeatthedoseafter12hoursifnecessary[zys@centos8tmp]$grep-n'[[:punct:]]'reg_file2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,5:andhesaid:"ohhhhhhhhho,ithurtsme"2基础正则表达式“[^]”表示对“[]”中的内容进行反向匹配不包括“[]”中的任意一个字符基础正则表达式-反向字符匹配[zys@centos8tmp]$grep-n'[^hH]er'reg_file //字符反向匹配:er前没有h和H1:Repeatthedoseafter12hoursifnecessary4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n'[^a-zA-Z]f'reg_file //结合使用反向匹配和字符范围2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n'[^[:blank:]]he'reg_file//结合使用反向匹配和特殊符号1:Repeatthedoseafter12hoursifnecessary2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,2基础正则表达式“^str”和“str$”分别表示以字符串str开头和结尾的行基础正则表达式-匹配行首和行尾[zys@centos8tmp]$grep-n'^She'reg_file

2:Shedozedoffinfrontofthefirewithher"cat"[zys@centos8tmp]$grep-n'^[RH]'reg_file

1:Repeatthedoseafter12hoursifnecessary4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n'^[[:lower:]]'reg_file5:andhesaid:"ohhhhhhhhho,ithurtsme"[zys@centos8tmp]$grep-n'ary$'reg_file

1:Repeatthedoseafter12hoursifnecessary[zys@centos8tmp]$grep-n'^$'reg_file3:[^]和^[]不同2基础正则表达式“.”表示匹配任意一个字符一个“.”只能匹配一个字符基础正则表达式-匹配任意字符[zys@centos8tmp]$grep-n'o.d'reg_file //o和d之间只有一个字符4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n'o..d'file1 //o和d之间有两个字符2:Shedozedoffinfrontofthefirewithher"cat"2基础正则表达式“*”表示其前面的字符可以重复出现0次、一次或多次基础正则表达式-匹配重复字符[zys@centos8tmp]$grep-n'o[a-z]*d'reg_file //o和d之间有任意多字符2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,[zys@centos8tmp]$grep-n's*'reg_file //s出现0或多次1:Repeatthedoseafter12hoursifnecessary2:Shedozedoffinfrontofthefirewithher"cat"3:4:HehesitatedforthemerestfrActionofasecond,5:andhesaid:"ohhhhhhhhho,ithurtsme"2基础正则表达式“\{m,n\}”表示字符可以出现m~n次基础正则表达式-匹配精确字符数[zys@centos8tmp]$grep-n'oh\{5,9\}o'reg_file//o之后的h出现5~9次5:andhesaid:"ohhhhhhhhho,ithurtsme"[zys@centos8tmp]$grep-n's\{2\}'reg_file //s出现2次1:Repeatthedoseafter12hoursifnecessary[zys@centos8tmp]$grep-n's\{1,\}'reg_file //s至少出现1次1:Repeatthedoseafter12hoursifnecessary4:HehesitatedforthemerestfrActionofasecond,5:andhesaid:"ohhhhhhhhho,ithurtsme"[zys@centos8tmp]$grep-n'off\{,1\}'reg_file //of之后的f至多出现1次2:Shedozedoffinfrontofthefirewithher"cat"4:HehesitatedforthemerestfrActionofasecond,2基础正则表达式基础正则表达式-总结2基础正则表达式任务3Shell脚本认识Shell脚本12脚本执行与返回值3运算符与条件测试4分支结构5循环结构6Shell函数1认识Shell脚本Shell脚本是一组Linux命令的集合把脚本文件提交给Bash解释执行支持以编程的方式编写命令支持自动化运维Shell脚本基本概念[zys@centos8~]$cdshell[zys@centos8shell]$vimmyscript.sh#!/bin/bash#Thisismyfirstshellscriptecho"Helloworld..."1认识Shell脚本2脚本执行与返回值设置脚本文件的可执行权限指定脚本文件的绝对路径或相对路径直接执行脚本执行方式-为脚本文件添加执行权限[zys@centos8shell]$chmoda+xmyscript.sh //为脚本文件添加执行权限[zys@centos8shell]$ls-lmyscript.sh-rwxr-xr-x.1zysdevteam672月2922:39myscript.sh[zys@centos8shell]$./myscript.sh //输入脚本文件名直接执行Helloworld...2脚本执行与返回值使用sh或bash命令执行脚本文件,把文件名作为参数sh其实是bash的链接文件不管脚本文件有没有可执行权限,都可以采用这种方式执行脚本执行方式-使用sh命令[zys@centos8shell]$whichsh/usr/bin/sh[zys@centos8shell]$ls-l/usr/bin/shlrwxrwxrwx.1rootroot41月122021/usr/bin/sh->bash[zys@centos8shell]$shmyscript.sh //相当于bashmyscript.shHelloworld...2脚本执行与返回值使用source命令或点运算符“.”执行脚本文件,后跟脚本文件名脚本执行方式-source[zys@centos8shell]$sourcemyscript.sh //相当于.myscript.shHelloworld...2脚本执行与返回值前两种方式,脚本文件在当前Bash进程的子进程中执行,在脚本文件中无法使用父进程创建的变量第3种方式则是直接在当前Bash进程中执行脚本执行方式-区别[zys@centos8shell]$vimmyscript.sh

#!/bin/bashecho"Helloworld..."echo"currentpidis$$" #在脚本中查询进程PIDecho"valueofp_varis'$p_var'" #在脚本中使用变量p_var[zys@centos8shell]$p_var="variableinparentprocess"

[zys@centos8shell]$echo$$4278 <==父进程PID[zys@centos8shell]$shmyscript.sh //第2种执行方式Helloworld...currentpidis4428 <==子进程PIDvalueofp_varis'' <==变量值为空[zys@centos8shell]$sourcemyscript.sh //第3种执行方式Helloworld...currentpidis4278 <==父进程PIDvalueofp_varis'variableinparentprocess'2脚本执行与返回值Shell脚本的执行顺序是从上至下、从左至右出现在“#”之后的内容为注释,除非“#”是字符串的一部分第1行一般是以“#!”开头,说明脚本文件的属性对于空行、空格或制表符(Tab)直接忽略把回车符当作一条命令的结束符,读到回车符就开始执行命令在行末输入转义符“\”换行继续输入命令脚本执行顺序2脚本执行与返回值脚执行结束,都会返回一个整数类型的状态码一般用0表示执行成功,用非0值表示异常结束可以使用“$?”特殊变量查看状态码还可以使用exit命令指定返回值,形式为exitn,取值范围是0~255脚本状态码[zys@centos8shell]$vimmyscript.sh#!/bin/bashecho"Helloworld..."exit0 #在脚本中指定退出状态码为0[zys@centos8shell]$shmyscript.shHelloworld...[zys@centos8shell]$echo$?02脚本执行与返回值可以向脚本文件传递参数常用的表示方法:$n$#$*$@脚本参数[zys@centos8shell]$vimmyscript.sh

#!/bin/bashecho"Helloworld..."echo"I'mfrom$1,$2"echo"Totalof$#parameters:$@"[zys@centos8shell]$shmyscript.shJiangsuChina //输入两个参数Helloworld...I'mfromJiangsu,ChinaTotalof2parameters:JiangsuChina2脚本执行与返回值3运算符与条件测试采用“$((exp))”的形式,内层的小括号中是算术表达式“$(())”只支持整数的算术运算表达式中的变量可以不使用“$”前导符号算术运算[zys@centos8shell]$vimmyscript.sh

#!/bin/basha=5;b=6echo$((5+6))echo$(($a+$b))[zys@centos8shell]$shmyscript.sh

11113运算符与条件测试采用“$((exp

))”进行整数间的算术比较运算运算符包括“<”“>”“<=”“>=”“==”“!=”如果比较结果为真,表达式返回1,否则返回0算术运算(续)[zys@centos8shell]$vimmyscript.sh#!/bin/basha=5;b=6echo$((a>b))echo$((a!=b))[zys@centos8shell]$shmyscript.sh

013运算符与条件测试采用“$((exp

))”进行整数间的算术比较运算运算符包括“<”“>”“<=”“>=”“==”“!=”如果比较结果为真,表达式返回1,否则返回0算术运算(续)[zys@centos8shell]$vimmyscript.sh

#!/bin/basha=5;b=6echo$((a>b?a:b)) #条件运算符echo$((a++)) #自增运算符echo$((++a)) #自增运算符[zys@centos8shell]$shmyscript.sh

6573运算符与条件测试主要用于判断一个表达式的真假,亦即表达式是否成立使用“$?”特殊变量获取test命令的返回值如果表达式为真,test命令返回0值,否则返回一个非0值test条件测试[zys@centos8shell]$vimmyscript.sh

#!/bin/bashtest-emyscript.sh&&echo"exist"||echo"notexist"test-emyscript2.sh&&echo"exist"||echo"notexist"[zys@centos8shell]$shmyscript.shexistnotexist3运算符与条件测试test条件测试-关系运算#!/bin/basha=11;b=16test$a-eq$b&&echo"$a=$b"||echo"$a!=$b"test$a-gt$b&&echo"$a>$b"||echo"$a<=$b"test$a-ge$b&&echo"$a>=$b"||echo"$a<$b"[zys@centos8shell]$shmyscript.sh11!=1611<=1611<163运算符与条件测试test条件测试-字符串运算[zys@centos8shell]$vimmyscript.sh

#!/bin/basha="centos"b=""test-z"$a"&&echo"'$a'isnull"||echo"'$a'isnotnull"test-n"$b"&&echo"'$b'isnotnull"||echo"'$b'isnull"test"$a"=="centos"&&echo"'$a'='centos'"||echo"'$a'!='centos'"[zys@centos8shell]$shmyscript.sh'centos'isnotnull''isnull'centos'='centos'3运算符与条件测试test条件测试-文件类型测试3运算符与条件测试test条件测试-文件权限和比较测试3运算符与条件测试test条件测试-文件测试示例[zys@centos8shell]$touchfile1;ls-l-rw-rw-r--.1zyszys02月2920:40file1-rwxrwxr-x.1zyszys922月2920:38myscript.sh[zys@centos8shell]$vimmyscript.sh

#!/bin/bashf1="myscript.sh"f2="file2"test-f"$f1"&&echo"$f1:ordinaryfile"||echo"$f1:notordinaryfile"test-r"$f1"&&echo"$f1:readable"||echo"$f1:notreadable"test"$f1"-nt"$f2"&&echo"$f1isnewerthan$f2"||echo"$f2isnewerthan$f1"[zys@centos8shell]$shmyscript.shmyscript.sh:ordinaryfilemyscript.sh:readablemyscript.shisnewerthanfile23运算符与条件测试test条件测试-布尔运算[zys@centos8shell]$vimmyscript.sh

#!/bin/basha=11;b=16f1="myscript.sh"f2="file2"test$a-gt$b-o$a-eq$b&&echo"$a>=$b"||echo"$a<$b"test-e"$f1"-a-r"$f1"&&echo"$f1isreadable"||echo"$f1isnotexistornotreadable"[zys@centos8shell]$shmyscript.sh11<16myscript.shisreadable3运算符与条件测试和test命令等价,支持关系运算、字符串运算、文件测试及布尔运算表达式的格式有特别的规定:操作数、运算符及中括号要用空格分隔[]条件测试[zys@centos8shell]$vimmyscript.sh

#!/bin/basha=11;b=16fname="myscript.sh"[$a-eq$b]&&echo"$a=$b"||echo"$a!=$b"[-n"$fname"-a"$fname"!="file2"]&&echo"'$fname'!='file2'"\ #换行输入||echo"'$fname'isnullor'$fname'='file2'"[-w"$fname"]&&echo"$fnameiswritable"||echo"$fnameisnotwritable"[zys@centos8shell]$shmyscript.sh11!=16'myscript.sh'!='file2'myscript.shiswritable3运算符与条件测试4分支结构以关键字if开头,后跟条件测试表达式。条件表达式可以只包含单一的条件测试,也可以是多个条件测试组成的复合表达式关键字then可以和if处于同一行,也可以换行书写。处于同一行时,必须在条件表达式后添加分号“;”当条件表达式成立时,可以执行一条或多条命令以关键字fi结束基本的if语句if条件表达式;then

条件表达式成立时执行的命令fi4分支结构基本的if语句-示例[zys@centos8shell]$vimmyscript.sh

#!/bin/bashread-p"DoyoulikeCentOSLinux(Y/N):"ans #从键盘读入ans变量值if["$ans"=="y"]||["$ans"=="Y"];then #如果ans是y或Y echo"Verygood!!!"fiif["$ans"=="n"]||["$ans"=="N"];then #如果ans是n或N echo"Oh,I'msorrytohearthat!!!"fi[zys@centos8shell]$shmyscript.shDoyoulikeCentOSLinux(Y/N):Y <==输入“Y”Verygood!!!4分支结构简单if-else语句[zys@centos8shell]$vimmyscript.sh

#!/bin/bashread-p"DoyoulikeCentOSLinux(Y/N):"ansif["$ans"=="y"]||["$ans"=="Y"];then echo"Verygood!!!"else #如果if中的条件不成立

echo"Oh,I'msorrytohearthat!!!"fi[zys@centos8shell]$shmyscript.shDoyoulikeCentOSLinux(Y/N):YVerygood!!!4分支结构if条件表达式;then

条件表达式成立时执行的命令else

条件表达式不成立时执行的命令fi用关键字else指定当if条件不成立时执行哪些命令复杂if-else语句[zys@centos8shell]$vimmyscript.sh

#!/bin/bashread-p"DoyoulikeCentOSLinux(Y/N):"ansif["$ans"=="y"]||["$ans"=="Y"];then echo"Verygood!!!"elif["$ans"=="n"]||["$ans"=="N"];then echo"Oh,I'msorrytohearthat!!!"else #如果if和elif中的条件都不成立

echo"Wronganswer!!!"fi[zys@centos8shell]$shmyscript.shDoyoulikeCentOSLinux(Y/N):

NOh,I'msorrytohearthat!!![zys@centos8shell]$shmyscript.shDoyoulikeCentOSLinux(Y/N):

XWronganswer!!!4分支结构if条件表达式1;then

条件表达式1成立时执行的命令elif条件表达式2;then

条件表达式2成立时执行的命令…else

所有条件都不成立时执行的命令fi从条件表达式1开始检查,执行条件成立时对应的命令如果所有的表达式都不成立,执行else对应的命令嵌套if语句[zys@centos8shell]$vimmyscript.sh

#!/bin/bashread-p"DoyoulikeCentOSLinux(Y/N):"ansif["$ans"=="y"]||["$ans"=="Y"];then read-p"Areyousure(Y/N):"ans_confirm if["$ans_confirm"=="y"]||["$ans_confirm"=="Y"];then echo"Verygood!!!" fielif["$ans"=="n"]||["$ans"=="N"];then echo"Oh,I'msorrytohearthat!!!"else echo"Wronganswer!!!"fi4分支结构内层的if语句在语法上和外层的if语句完全相同[zys@centos8shell]$shmyscript.shDoyoulikeCentOSLinux(Y/N):YAreyousure(Y/N):

YVerygood!!!执行脚本5循环结构while循环while[循环表达式];do

循环体done5循环结构while[循环表达式]do

循环体done反复执行某种有规律的操作,直到条件不成立while循环主要用于执行次数不确定的某种操作只要循环表达式为真,就执行循环体,除非循环表达式不成立或while循环5循环结构关键字while后跟循环表达式,简单条件测试表达式或复合表达式关键字do和done之间的命令称为循环体执行顺序:首先检查表达式是否成立,成立则执行循环体中的命令,否则退出while循环结构。循环体执行完之后,再次进行相同检查若表达式第一次的检查结果为假,则直接退出循环结构循环体中应该包含影响循环表达式结果的操作,否则while循环就会因为循环表达式永远为真而陷入“死循环”while循环-示例5循环结构[zys@centos8shell]$vimmyscript.sh

#!/bin/bashrandom_num=$(($RANDOM*100/32767)) #生成0~99的随机数read-p"Inputyourguess:"guess_num #获取用户输入while[$random_num-ne$guess_num] #如果不相等就一直执行do if[$random_num-gt$guess_num];then read-p"Inputabiggernum:"guess_num else read-p"Inputasmallernum:"guess_num fidoneecho"Great!!!"until循环until[循环表达式];do

循环体done5循环结构until[循环表达式]do

循环体done和while循环的含义正好相反执行顺序:当循环表达式为真时结束循环,否则一直执行循环体或until循环-示例5循环结构[zys@centos8shell]$vimmyscript.sh

#!/bin/bashrandom_num=$(($RANDOM*100/32767))read-p"Inputyourguess:"guess_numuntil[$random_num-eq$guess_num] doif[$random_num-gt$guess_num];then read-p"Inputabiggernum:"guess_numelse read-p"Inputasmallernum:"guess_numfidoneecho"Great!!!"[zys@centos8shell]$shmyscript.shInputyourguess:50Inputabiggernum:75Inputabiggernum:87Inputasmallernum:81Inputabiggernum:84Inputabiggernum:86Great!!!执行脚本for循环-第1种形式forvarinvalue_list;do

循环体done5循环结构forvarinvalue_listdo

循环体done主要用于执行次数确定的某种操作如果事先知道循环要执行多少次,使用for循环最合适把循环变量var设为value_list中的一个值,然后代入循环体执行,直到value_list中的每个值都使用一遍或for循环-第1种形式(示例)5循环结构[zys@centos8shell]$vimmyscript.sh

#!/bin/bashi=1;j=1echo'parametersfrom$*are:'forvarin"$*" #把$*中的每个值代入循环do echo"parameter$i:"$var i=$(($i+1))doneecho'parametersfrom$@are:'forvarin"$@" #把$@中的每个值代入循环do echo"parameter$j:"$var j=$(($j+1))done[zys@centos8shell]$shmyscript.shJiangsuChinaparametersfrom$*are:parameter1:JiangsuChinaparametersfrom$@are:parameter1:Jiangsuparameter2:China执行脚本for循环-第2种形式5循环结构for((初始化操作;循环表达式;赋值操作))do

循环体done循环变量的取值一般是一个整数通过控制取值的上限或下限确定循环体的执行次数第1步,为循环变量赋初始值第2步,如果循环表达式成立,则进入第3步执行循环休,否则退出for循环第3步,执行循环体第4步,改变循环变量

温馨提示

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

评论

0/150

提交评论