、shell入门简介1。1什么是shellshell脚本简介为啥介绍shell上次出了一篇linux命令详解,得到了很多小伙伴的认可,有部分粉丝私信我,让我出一份shell编程。进过一段时间准备,花了2周时间,整理了一篇shell入门到实战的博文,欢迎大家阅读,指点。什么是shell网上有很多shell的概念介绍,其实都很官方化,如果你对linux命令很熟悉,那么编写shell就不是一个难事,shell本质上是linux命令,一条一条命令组合在一起,实现某一个目的,就变成了shell脚本。它从一定程度上减轻了工作量,提高了工作效率。官方化的shell介绍Shell通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出,简单来说Shell就是一个用户跟操作系统之间的一个命令解释器。常见的shell有哪些BourneShell(usrbinsh或binsh)BourneAgainShell(binbash)CShell(usrbincsh)KShell(usrbinksh)ShellforRoot(sbinsh)最常用的shell是Bash,也就是BourneAgainShell。Bash由于易用和免费,在日常工作中被广泛使用,也是大多数Linux操作系统默认的Shell环境。 1。2shell编程注意事项shell编程有哪些注意事项 shell命名:Shell脚本名称命名一般为英文、大写、小写,后缀以。sh结尾 不能使用特殊符号、空格 见闻之意,名称要写的一眼可以看出功能。shell编程首行需要Ibinbash开头 shell脚本变量不能以数字、特殊符号开头,可以使用下划线,但不能用破折号 创建一个伟大编程项目HelloWorld1。3第一个shell脚本helloworld创建一个伟大编程项目HelloWorld创建一个Helloword。sh文件〔rootalyserver01〕touchHelloword。sh编辑Helloword。sh文件〔rootalyserver01〕vimHelloword。sh〔rootalyserver01〕catHelloword。sh!binbashThisisowerfirstshellbyauthorrivers2021。09echohelloworld〔rootalyserver01〕〔rootalyserver01〕llHelloword。shrwrr1rootroot85Sep2022:26Helloword。sh赋予执行权限〔rootalyserver01〕chmodoxHelloword。sh运行helloword。sh脚本〔rootalyserver01〕。Helloword。shhelloworld〔rootalyserver01〕 二、shell环境变量讲解2。1shell变量详解环境变量介绍什么是变量很多人可能会说,可以变化的量就是变量。但是发现很多汉语意思很强大,你看的懂的字,却不一定可以理解它的意思。这里你可以理解为a1,同时还可以a2、a3,不同的值都可以复制给同一个变量a。常见的3种变量Shell编程中变量分为三种,分别是系统变量、环境变量和用户变量,Shell变量名在定义时,首个字符必须为字母(az,AZ),不能以数字开头,中间不能有空格,可以使用下划线(),不能使用(),也不能使用标点符号等。简单的变量介绍〔rootkeeplivedserver〕a18〔rootkeeplivedserver〕echoa182。2shell系统变量介绍系统变量Shell常见的变量之一系统变量,主要是用于对参数判断和命令返回值判断时使用,系统变量详解如下:0当前脚本的名称;n当前脚本的第n个参数,n1,2,9;当前脚本的所有参数(不包括程序本身);当前脚本的参数个数(不包括程序本身);?令或程序执行完后的状态,返回0表示执行成功;程序本身的PID号。2。3shell环境变量介绍2。3。1常见的系统环境变量环境变量介绍Shell常见的变量之二环境变量,主要是在程序运行时需要设置,环境变量详解如下:PATH命令所示路径,以冒号为分割;HOME打印用户家目录;SHELL显示当前Shell类型;USER打印当前用户名;ID打印当前用户id信息;PWD显示当前所在路径;TERM打印当前终端类型;HOSTNAME显示当前主机名;PS1定义主机命令提示符的;HISTSIZE历史命令大小,可通过HISTTIMEFORMAT变量设置命令执行时间;RANDOM随机生成一个0至32767的整数;HOSTNAME主机名2。4shell用户环境变量介绍2。4。1自定义shell环境变量用户自定义变量常见的变量之三用户变量,用户变量又称为局部变量,主要用在Shell脚本内部或者临时局部使用,系统变量详解如下:arivers自定义变量A;Httpdsorthttpd2。4。697。tar自定义变量NSOFT;BACKDIRdatabackup自定义变量BACKDIR;IPaddress10。0。0。1自定义变量IP1;2。4。2echo打印菜单栏使用echo打印菜单栏,显示http2。4安装过程echo打印httpd2。4安装步骤〔rootwebserver01〕touchhttpd2。4install。sh赋予执行权限〔rootwebserver01〕chmodoxhttpd2。4install。sh〔rootwebserver01〕。httpd2。4install。sh 2。4。3shell中彩色输出helloworldechoe扩展!binbashThisisechocolorshellbyauthorrivers2021。0923字体颜色foriin{31。。37};doechoe33〔i;40mHelloworld!33〔0mdone背景颜色foriin{41。。47};doechoe33〔47;{i}mHelloworld!33〔0mdone显示方式foriin{1。。8};doechoe33〔i;31;40mHelloworld!33〔0mdone 三、shell编程流程控制语句3。1if条件语句介绍3。1。1常用的单双分支if条件语句If条件判断语句,通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断单分支语句比较大小if(条件表达式);then语句1fi双分支if语句if(表达式)语句1else语句2fi多支条件语句判断成绩if(表达式)语句1elif语句2elif语句2fi3。1。2if常见判断逻辑运算符详解if常见判断逻辑运算符f判断文件是否存在eg:if〔ffilename〕;d判断目录是否存在eg:if〔ddir〕;eq等于,应用于整型比较equal;ne不等于,应用于整型比较notequal;lt小于,应用于整型比较letter;gt大于,应用于整型比较greater;le小于或等于,应用于整型比较;ge大于或等于,应用于整型比较;a双方都成立(and)逻辑表达式a逻辑表达式;o单方成立(or)逻辑表达式o逻辑表达式;z空字符串;x是否具有可执行权限单方成立;双方都成立表达式。3。1。3使用单分支语句判断crond进程是否在运行案例判断crond服务是否运行!binbashthisischeckcrondbyauthorriverson20219。23定义一个变量名namecrondnum(psefgrepnamegrepvcgrep)if〔numeq1〕;thenechonumrunning!elseechonumisnotrunning!fi3。1。4判断系统目录是否存在案例判断系统目录是否存在!binbashthisischeckdirectorybyauthorriverson20219。27if〔!ddatariversa!dtmprivers〕;thenmkdirpdatariversfi3。1。5多个条件判断学生分数等级案例判断学生成绩等级if语句可以直接对命令状态进行判断,就省去了获取?这一步!如果第一个条件符合就不再向下匹配!binbashthischeckgradeshellbyauthorriverson20210927grade1if〔gradegt90〕;thenechoIssverygood!elif〔gradegt70〕;thenechoIssisgood!elif〔gradege60〕;thenechopasselseechonopassfi 3。2for循环语句介绍for循环语句格式:forname〔〔in〔word。。。〕〕;〕dolist;donefor变量名in取值列表;do语句1done3。2。1检查同局域网多台主机是否存活检查多台主机存活情况!binbashcheckhostsisonOffbyriverson2021923Network1forHostin(seq1254)dopingc1Network。Hostdevnullresult0result1if〔result0〕;thenechoe33〔32;1mNetwork。Hostisup33〔0mechoNetwork。Hosttmpup。txtelseechoe33〔;31mNetwork。Hostisdown33〔0mechoNetwork。Hosttmpdown。txtfidone 3。3while循环语句介绍while循环语句While循环语句与for循环功能类似,主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于需要循环某个文件或者列表,满足循环条件会一直循环,不满足则退出循环,其语法格式以whiledo开头,done结尾与while关联的还有一个until语句,它与while不同之处在于,是当条件表达式为false时才循环,实际使用中比较少,这里不再讲解。while(表达式)do语句1donebreak和continue语句break和continue语句break是终止循环。continue是跳出当前循环。示例1:在死循环中,满足条件终止循环whiletrue;doletNif〔Neq5〕;thenbreakfiechoNdone输出:1234示例2:举例子说明continue用法N0while〔Nlt5〕;doletNif〔Neq3〕;thencontinuefiechoNdone输出:124打印1100数字i0while((i100))doechoiiexpri1done 3。3。1While循环求1100的总和案例求1100的总和!binbashbyauthorriverson2021927j0i1while((i100))dojexprij((i))doneechoj 3。3。2每10秒循环判断次hbs用户是否登录系统案例每10秒循环判断系统登录〔rootwebserver01script〕vimlogin。sh!binbashCheckFiletochange。Byauthorrivers2021927USERShbswhiletruedoechoTheTimeisdateFTsleep10NUMwhogrepUSERSwclif〔〔NUMge1〕〕;thenechoTheUSERSislogininsystem。fidone 3。4case选择语句介绍case选择语句Case选择语句,主要用于对多个选择条件进行匹配输出,与ifelif语句结构类似,通常用于脚本传递输入参数,打印出输出结果及内容,其语法格式以Casein开头,esac结尾。语法格式如下:case模式名in模式1)命令;;模式2)命令;;)不符合以上模式执行的命令esac每个模式必须以右括号结束,命令结尾以双分号结束。3。4。1使用case编写个httpd服务启动脚本编写httpd服务启动脚本〔rootwebserver01script〕vimhttpdstart。shcheckhttpserverstartstopstarusbyauthorriverson2021927whiletruedoechoe33〔31mstart33〔0m33〔32mstop33〔0m33〔33mstatus33〔0m33〔34mquit33〔0mreadp请输入你的选择startstopquit:charcasecharinstart)systemctlstarthttpdechohttpd服务已经开启echo开启失败;;stop)systemctlstophttpdechohttpd服务已经关闭echo关闭失败;;restart)systemctlrestarthttpdechohttpd服务已经重启echo重启失败;;status)systemctlstatushttpdechoehttpd的服务状态;;quit) 3。5select选择语句介绍select选择语句select是一个类似于for循环的语句Select语句一般用于选择,常用于选择菜单的创建,可以配合PS3来做打印菜单的输出信息,其语法格式以selectindo开头,done结尾:selectiin(表达式)do语句done选择mysql版本!binbashbyauthorriverson2021927PS3Selectanumber:whiletrue;doselectmysqlversionin5。15。6quit;docasemysqlversionin5。1)echomysql5。1break;;5。6)echomysql5。6break;;quit)exit;;)echoInputerror,Pleaseenteragain!breakesacdonedone 3。5。1使用select打印lnmp菜单栏案例打印lnmp菜单栏!binbashbyauthorriverson2021927PS3Pleaseenteryouselectinstallmenu:selectiinhttpphpmysqlquitdocaseiinhttp)echoe33〔31mTestHttpd33〔0m;;php)echoe33〔32mTestPHP33〔0m;;mysql)echoe33〔33mTestMySQL。33〔0m;;quit)echoe33〔32mTheSystemexit。33〔0mexitesacdone 3。6shell函数、数组编程实战函数Shell允许将一组命令集或语句形成一个可用块,这些块称为Shell函数,Shell函数的用于在于只需定义一次,后期随时使用即可,无需在Shell脚本中添加重复的语句块,其语法格式以functionname(){开头,以}结尾。Shell编程函数默认不能将参数传入()内部,Shell函数参数传递在调用函数名称传递,例如nameargs1args2。函数语法func(){command1command1}fun直接调用函数名Shell函数很简单,函数名后跟双括号,再跟双大括号。通过函数名直接调用,不加小括号。!binbashfunc(){VAR((11))returnVARechoThisisafunction。}funcecho?bashtest。sh2数组数组是相同类型的元素按一定顺序排列的集合。格式:array(元素1元素2元素3。。。)用小括号初始化数组,元素之间用空格分隔。定义方法1:初始化数组array(abc)定义方法2:新建数组并添加元素array〔下标〕元素定义方法3:将命令输出作为数组元素array((command)) 3。6。1定义一个httpd安装的函数案例创建apache软件安装函数〔rootwebserver01script〕vimxx。sh!binbashautoinstallapacheByauthorrivers20210927HttpddefinepathvariableFILEShttpd2。2。31。tar。bz2LESDIRhttpd2。2。31URLhttp:mirrors。cnnic。cnapachehttpdPREFIXusrlocalapache2functionApacheinstall(){Installhttpdwebserverif〔〔1eq1〕〕;thenwgetcURLFILEStarjxvfFILEScdFILESDIR。configureif〔?eq0〕;thenmakemakeinstallechoe33〔32mechoe33〔32mTheFILESDIRServerInstallSuccess!33〔0melseechoe33〔32mTheFILESDIRMakeorMakeinstallERROR,Pleaexit0fifi}Apacheinstall1调用函数,传参为13。6。2遍历数组元素案例遍历数组元素方法1:!binbashIP(10。0。0。110。0。0。210。0。0。3)for((i0;i{IP〔〕};i));doecho{IP〔i〕}donebashtest。sh10。0。0。110。0。0。210。0。0。3方法2:!binbashIP(10。0。0。110。0。0。210。0。0。3)forIPin{IP〔〕};doechoIPdone四、shell编程实战案例4。1shell脚本实战之系统备份脚本案例Tar工具全备、增量备份网站,Shell脚本实现自动打包备份!binbashAutoBackupLinuxSystemFilesbyauthorriverson20210928SOURCEDIR()TARGETDIRdatabackupYEARdateYMONTHdatemDAYdatedWEEKdateuANAMEdateHMFILESsystembackup。tgzCODE?if〔z〕;thenechoe33〔32mUsage:PleaseEnterYourBackupFilesorDirectoriesUsage:{0bootetc}33〔0mexitfiDetermineWhethertheTargetDirectoryExistsif〔!dTARGETDIRYEARMONTHDAY〕;thenmkdirpTARGETDIRYEARMONTHDAYechoe33〔32mTheTARGETDIRCreatedSuccessfully!33〔0mfiEXECFullBackupFunctionCommandFullBackup(){if〔WEEKeq7〕;thenrmrfTARGETDIRsnapshotcdTARGETDIRYEARMONTHDAY;targTARGETDIRsnapshotczvfFILES{SOURCEDIR〔〕}〔CODE0〕echoe33〔32mTheseFullBackupSystemFilesBackupSuccessfully!33〔0mfi}PerformincrementalBACKUPFunctionCommandAddBackup(){if〔WEEKne7〕;thencdTARGETDIRYEARMONTHDAY;targTARGETDIRsnapshotczvfANAMEFILES{SOURCEDIR〔〕}〔CODE0〕echoe33〔32mTheseAddBackupSystemFilesTARGETDIRYEARMONTHDAY{YEAR}ANAMEFILESBackupSuccessfully!33〔0mfi}sleep3FullBackup;AddBackup4。2shell脚本实战之收集系统信息、案例shell脚本实现服务器信息自动收集catEOFWelcometousesystemCollectEOFipinfoifconfiggrepBcasttail1awk{print2}cutd:f2cpuinfo1catproccpuinfogrepmodelnametail1awkF:{print2}sedsgawk{print1,3,4,NF}cpuinfo2catproccpuinfogrepphysicalidsortuniqcwclservinfohostnametail1diskinfofdisklgrepDiskgrepvidentifierawk{print2,3,4}seds,gmeminfofreemgrepMemawk{printTotal,1,2M}loadinfouptimeawk{printCurrentLoad:(NF2)}seds,gmarkinfoBeiJingIDCechoe33〔32m33〔1mechoIPADDR:{ipinfo}echoHOSTNAME:servinfoechoCPUINFO:{cpuinfo1}X{cpuinfo2}echoDISKINFO:diskinfoechoMEMINFO:meminfoechoLOADINFO:loadinfoechoe33〔32m33〔0mechoen33〔36mYouwanttowritethedatatothedatabases?33〔1m;readensureif〔ensureyesoensureyoensureY〕;thenechoechoe33〔31mmysqluauditp123456Dauditeinsertintoauditsystemvalues(,{ipinfo},servinfo,{cpuinfo1}X{cpuinfo2},diskinfo,meminfo,loadinfo,markinfo)33〔0mmysqlurootp123456Dtesteinsertintoauditsystemvalues(,{ipinfo},servinfo,{cpuinfo1}X{cpuinfo2},diskinfo,meminfo,loadinfo,markinfo)elseechoPleasewait,exit。。。。。。exitfi 4。3shell脚本实战之一键部署lnmp架构、案例批量部署lnmp架构〔rootwebserver01script〕vimlnmp。sh!binbashinstalllnmpbyauthorriverson2021928nginx环境准备Nginxurlhttps:nginx。orgdownloadnginx1。20。1。tar。gzNginxprefixusrlocalnginxmysql环境准备Mysqlversionmysql5。5。20。tar。gzMysqldirmysql5。5。20Mysqlurlhttps:downloads。mysql。comarchivesgetp23filemysql5。5。20。tar。gzMysqlprefixusrlocalmysqlphp环境准备Phpversionphp7。2。10。tar。gzPhpprefixusrlocalphp7。2。10functionnginxinstall(){if〔〔1eq1〕〕;thenif〔?eq0〕;thenmakemakeinstallfifi}functionmysqlinstall(){if〔〔1eq2〕〕;thenDMYSQLUNIXADDRtmpmysql。sockDMYSQLDATADIRdatamysqlDSYSCONFDIRetcDMYSQLUSERmysqlDMYSQLTCPPORT3306DWITHXTRADBSTORAGEENGINE1DWITHINNOBASESTORAGEENGINE1DWITHPARTITIONSTORAGEENGINE1DWITHBLACKHOLESTORAGEENGINE1DWITHMYISAMSTORAGEENGINE1DWITHREADLINE1DENABLEDLOCALINFILE1DWITHEXTRACHARSETS1DDEFAULTCHARSETutf8DDEFAULTCOLLATIONutf8generalciDEXTRACHARSETSallechoe33〔32mTheMysqldirServerInstallSuccess!33〔0melseechoe33〔32mTheMysqldirMakeorMakeinstallERROR,PleaseCheck。。。。。。exit0fibincpsupportfilesmysmall。cnfetcmy。cnfbincpsupportfilesmysql。serveretcinit。dmysqldchmodxetcinit。dmysqldchkconfigaddmysqldchkconfigmysqldonfi}functionphpinstall(){if〔〔1eq3〕〕;thenif〔?eq0〕;thenmakeZENDEXTRALIBSliconvmakeinstallif〔〔1eq3〕〕;thenwgetPhpurltarxfPhpversioncdPhpdiryuminstallbxml2bzip2libcurllibjpeglibpngfreetypegmplibmcryptreadlinelibxslty。configureprefixPhpprefixdisablefileinfoenablefpmwithconfigfilepathetcwiconfigfilescandiretcphp。dwithopensslwithzlibwithcurlenableftpwithgdwithxmlrpcwithjpegdirwithpngdirwithfreetypedirenablegdnativettfenablembstringwithmcryptusrlocallibmcryptenablezipenablemysqlndwithmysqlimysqlndwithpdomysqlmysqlndwithmysqlsockvarlibmysqlmysql。sockwithoutpearenablebcmathif〔?eq0〕;thenmakeZENDEXTRALIBSliconvmakeinstallechoe33〔32m33〔0mechoe33〔32mThePhpversionServerInstallSuccess!33〔0melseechoe33〔32mThePhpversionMakeorMakeinstallERROR,PleaseCheck。。。。。。exit0fifi}PS3Pleaseenteryouselectinstallmenu:selectiinnginxmysqlphpquitdolnmp。sh113L,3516Cwritten〔rootwebserver01script〕vimlnmp。shchkconfigaddmysqldchkconfigmysqldonfi}functionphpinstall(){if〔〔1eq3〕〕;thenif〔?eq0〕;thenmakeZENDEXTRALIBSliconvmakeinstallechoe33〔32m33〔0mechoe33〔32mThePhpversionServerInstallSuccess!33〔0melseechoe33〔32mThePhpversionMakeorMakeinstallERROR,PleaseCheck。。。。。。exit0fifi}PS3Pleaseenteryouselectinstallmenu:selectiinnginxmysqlphpquitdocaseiinnginx)nginxinstall1;;mysql)mysqlinstall2;;php)phpinstall3;;quit)exitesacdone总结 shell是我们工作中很重要的一部分,在工作中充当着重要的角色。企业生产环境中,服务器规模成百上千,如果依靠人工去维护和管理是非常吃力的,基于Shell编程脚本管理和维护服务器变得简单、从容,而且对企业自动化运维之路的建设起到极大的推动作用。 所以,不管是你看到哪里的书籍、资料、还是视频,每个老师讲的侧重点都不一样,但是基础是一样的,要想学好shell,需要反复动手写,思考,理解shell的精髓,才能掌握shell,写好shell。 来源:https:developer。aliyun。comarticle946241