当前位置: 首页 > Linux

看完文献,LinuxShell编程比书本更易懂

时间:2023-04-06 23:13:54 Linux

1.Shell编程完整版参考链接:LinuxShell编程pdf版1.简介Shell是一个用C语言编写的程序,通过它用户可以访问操作系统内核服务。Shell既是命令语言又是编程语言。Shell脚本是为shell编写的脚本程序。Shell编程一般是指shell脚本,而不是开发shell本身。Shell编程和java、php编程一样,只要有可以编写代码的文本编辑器和可以解释执行的脚本解释器就可以了。有许多类型的Linuxshell解释器。一个系统中可以有多个shell。可以使用cat/etc/shells命令查看系统安装的shell解释器。Bash由于其易用性和免费成本而被广泛用于日常工作。同时,Bash也是大多数Linux系统的默认shell。shell解释器java需要虚拟机解释器,shell脚本也需要解析器,如下:[root@node01shells]cat/etc/shells/bin/sh/bin/bash/sbin/nologin/bin/dash/bin/tcsh/bin/csh2.快速入门1)编写脚本新建/export/hello.sh文件,内容如下:#!/bin/bashecho'helloworld'\#!是一个约定的标记,它告诉系统这个脚本需要执行什么解释器,也就是使用哪个shell。echo命令用于将文本输出到窗口。2)执行shell脚本执行方式1[root@node01shells]/bin/sh01.shhelloworldor[root@node01shells]/bin/bash01.shhelloworld问题:bash和sh是什么关系?答:sh是Bash快捷执行方法2方法1的简化方法:[root@node01shells]bashhello.shhelloworld[root@node01shells]shhello.shhelloworld问题:为什么/bin/可以省略答:因为在PATH环境变量中添加了/bin/目录,所以在使用/bin/sh等类似命令时,/bin执行方式3./文件名[root@node01shells]./hello.sh-bash:./01.sh:permissionInsufficient问题:权限不够怎么办?[root@node01shells]chmod755hello.sh#再次执行:[root@node01shells]./hello.shhelloworld!3.Shell变量1)简介在shell脚本中,定义变量时,变量名不加美元符号$,如:your_name="runoob.com"注意:变量名和等号之间不能有空格sign,它可能与你所熟悉的所有编程语言都不一样。同时,变量名的命名必须遵循以下规则:命名只能使用英文字母、数字和下划线,首字符不能以数字开头。中间不能有空格,可以用下划线_。不能使用标点符号。bash中的关键字不能使用(使用help命令查看保留关键字)。有效的Shell变量名示例如下:RUNOOBLD_LIBRARY_PATH_varvar2无效变量名:?var=123user*name=runoob除了显式直接赋值外,还可以使用语句为变量赋值,如:forfilein`ls/etc`orforfilein$(ls/etc)以上语句会循环出/etc下目录的文件名。2)使用变量使用定义的变量,只需在变量名前加一个美元符号即可,如:your_name="zhangsan"echo$your_nameecho${your_name}变量名外的花括号可选,是否使用加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:forskillinjavaphppython;doecho"Iamgoodat${skill}Script"done如果技能变量不加花括号,写成echo"Iamgoodat$skillScript",解释器会把$skillScript当作一个变量(它的value为空),代码执行结果将不是我们所期望的。建议将所有变量都用大括号括起来,这是一种很好的编程习惯。定义的变量可以重新定义,如:your_name="tom"echo$your_nameyour_name="alibaba"echo$your_name是合法的,但是注意第二次赋值时不能写$your_name="alibaba",美元符号只是使用变量时添加。3)删除变量使用unset命令删除变量。语法:unsetvariable_name变量被删除后不能再使用。unset命令不能删除只读变量。示例#!/bin/shmyUrl="http://www.runoob.com"unsetmyUrlecho$myUrl上面的示例执行不会有任何输出。4)只读变量使用readonly命令定义一个变量为只读变量,只读变量的值不能改变。以下示例尝试更改只读变量,结果出错:#!/bin/bashmyUrl="http://www.google.com"readonlymyUrlmyUrl="http://www.runoob.com"运行脚本,结果如??下:/bin/sh:NAME:Thisvariableisreadonly.4.StringString是shell编程中最常用、最有用的数据类型(除了数字和字符串,没有其他好用的类型),而字符串可以使用单引号、双引号,也可以不用引号。1)单引号skill='java'str='Iamgootat$skill'echo$str输出结果为:Iamgootat$skill单引号字符串的限制:单引号内的任何字符都原样输出,单引号字符串中的变量无效;单引号不能出现在单引号字符串中(即使在单引号使用转义字符之后),但它们可以成对出现并用作字符串拼接。2)双引号skill='java'str="Iamgootat$skill"echo$str输出结果为:Iamgootjava双引号的优点:双引号中可以有变量,转义字符可以出现在双引号3)获取字符串长度skill='java'echo${skill}#输出结果:javaecho${#skill}#输出结果:4or:exprlength"iamlilei"#输出结果:84)提取子串substring(2)substring(2,3)下面的例子从字符串的第二个字符开始截取4个字符:str="Iamgootat$skill"echo${str:2}#输出结果为:amgootjavafrom第二个字符开始截取,到最后echo${str:2:2}#输出结果为:am从第二个字符开始截取,截取2个字符5)查找子串查找字符a或m的位置(先出现的字母将被计算在内):str="Iamgootat$skill"echo`exprindex"$str"am`#outputis:3or:exprindex"iamlilei"am#outputresult:2returnedinSTRING在;中查找CHARS字符串的位置否则,返回0注意:上面脚本中的`是反引号(在Esc下面),不是单引号',不要误会。5.传递参数我们可以在执行shell脚本的时候给脚本传递参数,脚本中获取参数的格式为:$n。n代表一个数字,1是执行脚本的第一个参数,2是执行脚本的第二个参数,以此类推……在下面的例子中,我们向脚本传递三个参数并分别输出,其中$0为执行文件名:vim/export/sh/param.sh#!/bin/bashecho"Shell传参实例!";echo"执行文件名:$0";echo"第一个参数为:$1";echo"第一个第二个参数是:$2";echo"第三个参数是:$3";设置脚本的可执行权限并执行脚本。输出如下:$chmod755param.sh$./param.sh123Shell传参实例!执行文件名:./param.sh第一个参数为:1第二个参数为:2第三个参数为:3另外还有几个特殊字符用于处理参数:参数处理指令$#Transfer参数个数到脚本$*在单个字符串中显示传递给脚本的所有参数。例如“$*”用“”括起来,则所有参数将以“$1$2...$n”的形式输出。$$脚本运行的当前进程ID号$!ID号后台运行的最后一个进程的名称$@与$*相同,但使用引号并在引号中返回每个参数。例如,如果“$@”用“”括起来,则所有参数将以“”的形式输出$1""$2"..."$n"。$-显示当前shell使用的选项,与set命令相同。$?显示最后一个命令的退出状态。0表示没有错误,任何其他值表示错误。#!/bin/bashecho"Shell传递参数实例!";echo"第一个参数为:$1";echo"参数个数为:$#";echo"传递的参数显示为字符串:$*";执行脚本,输出如下:$chmod+xtest.sh$./test.sh123Shell传参实例!第一个参数为:1参数个数为:3传递的参数显示为字符串:123$*和$@的区别:相同点:所有参数都用引号引起来。区别:只体现在双引号中。假设脚本运行时写了1、2、3三个参数,那么“*”就相当于“123”(传递一个参数),“@”相当于“1”“2”“3”(传递了三个参数)。#!/bin/bashecho"--$*演示---"foriin"$*";做echo$idoneecho"--$@Demo---"foriin"$@";doecho$idone执行脚本,输出如下:$chmod+xtest.sh$./test.sh123--$*Demo---123--$@Demo---1236.Shell算术运算符1)简介Shell与其他编程一样,支持的运算符包括:算术、关系、布尔、字符串等。原生bash不支持简单的数学运算,但可以通过其他命令实现,比如expr。expr是一个表达式计算工具,可以完成表达式的求值运算。例如两个数相加:val=`expr2+2`echo$val注意:表达式和运算符之间必须有空格,例如2+2是错误的,必须写成2+2。完整的表达式必须用`括起来,注意不是单引号,是在Esc键下。下表列出了常用的算术运算符,假设变量a为10,变量b为20:运算符说明示例+加法expr$a+$b结果为30。-减法expr$a-$b结果为-10.*乘法expr$a*$b结果为200./divisionexpr$b/$a结果为2.%expr$b%$a的余数为0.=Assignmenta=$b将赋值给变量b到a。==相等。用于比较两个数字,如果相同则返回真。[$a==$b]返回false。!=不相等。用于比较两个数字,如果不相同则返回真。[$a!=$b]返回真。注意:条件表达式要放在方括号之间,并且要有空格,例如:[$a==$b]是错误的,必须写成[$a==$b]。2)Example#!/bin/basha=4b=20#加法运算eachexpr$a+$b#减法运算echoexpr$a-$b#乘法运算,注意*号前需要反斜杠echoexpr$a\*$b#除法运算echo$a/$b另外,还可以通过(())、$(())、$[]进行算术运算。((a++))echo"a=$a"c=$((a+b))d=$[a+b]echo"c=$c"echo"d=$d"7.流程控制1)ifelse1.1ifif语句的语法格式:ifcondition;然后command1command2...commandNfidemo[root@hadoop01export]#catif_test.sh#!/bin/basha=20if[$a-gt10];thenecho"a如果大于10,"fi"末尾的fi表示if是倒写的,后面会遇到类似的。1.2ifelseifelse语法格式:ifcondition;thencommand1command2...commandNelsecommandfi1.3ifelse-ifelseifelse-ifelse语法格式:ifcondition1;thencommand1elifcondition2;thencommand2elsecommandNfi下面的例子判断两个变量是否相等:关系运算符关系运算符只支持数字,不支持字符串,除非字符串的值是一个数字,下表列出了常用的关系运算符,假设变量a为10,变量b为20:a-eq$b]返回false-ne检查两个数是否不相等,不相等返回truenotequal[$a-ne$b]返回true-gt检查左边的数是否大于右边的数,如果大于则返回真。大于[$a-gt$b]返回false。-lt检查左边的数是否小于右边的数,如果是,则返回真。小于[$a-lt$b]返回真。-ge检查左边的数字是否大于或等于右边的数字,如果是,则返回真。大于或等于[$a-ge$b]返回false。-le检查左边的数字是否小于或等于右边的数字,如果是,则返回真。小于或等于[$a-le$b]返回真。案例:[root@hadoop01export]#catif_test.sh#!/bin/basha=20b=10#需求1:判断a是否为100if[$a>100];thenecho"$aisgreaterthan100"fi#需求二:判断a是否等于bif[$a-eq$b];thenecho"$aisequalto$b"elseecho"$aisnotequalto$b"fi#需求三:判断a和b比较if[$a-lt$b];然后echo"$a小于$b"elif[$a-eq$b];thenecho"$aisequalto$b"elseecho"$aisgreaterthan$b"fi#需求四:判断(a+10)比较大小与(b*b)iftest$[a+10]-GT$[b*b];thenecho"(a+10)isgreaterthan(b*b)"elseecho"(a+10)Lessthanorequalto(b*b)"fi2)for循环的长度有限,完整版参考链接:LinuxShell编程pdf版