标题:Shell编程标签:-Shell类别:-Linux[TOC]注意:不要将脚本命名为test,因为test是内置应用程序的第一个shellscript#!/bin/bash#文件:hello.shecho"你好世界!"bovenson@ThinkCentre:~/Git/neu-ip-gateway-manager$bashhello.sh你好世界!变量定义v="这是一个变量。"注意变量名和等号之间不能有空格。第一个字符必须是字母(a-z,A-Z)。中间不能有空格,可以使用下划线(_),不能使用标点符号,不能使用bash中的关键字(可以使用help命令查看保留关键字)。定义的变量,可以重新定义为使用一个定义的变量,只需要在变量名前面加一个美元符号#!/bin/bash#file:hello.shv="Thisisavariable."echo$vecho${v}#变量名外的花括号是可选的,可以加也可以不加。添加花括号是为了帮助解释器识别变量的边界名称是可选的,您可以添加或不添加。添加花括号是为了帮助解释器识别变量的边界。建议为所有变量添加花括号。这是一个很好的编程习惯,比如以下情况:熟练掌握AdaCoffeActionJava;doecho"Iamgoodat${skill}Script"done只读变量使用readonly命令将变量定义为只读变量,只读变量的值不能改变。#!/bin/bash#文件:hello.shmy_name="szk"readonlymy_namemy_name="bovenson"bovenson@ThinkCentre:~/Tmp$bashhello.shhello.sh:line6:my_name:只读变量bovenson@ThinkCentre:~/Tmp$删除变量unsetvariable_name注意:删除变量后,不能再使用unset命令。只读变量变量类型无法删除。局部变量:局部变量定义在脚本或命令中,只在当前shell实例中有效。其他shell启动的程序无法访问局部变量环境变量:所有程序,包括shell启动的程序,都可以访问环境变量,有些程序需要环境变量来保证其正常运行。Shell脚本在需要的时候也可以定义环境变量Shell变量:Shell变量是shell程序设置的特殊变量。一些shell变量是环境变量,一些是局部变量。这些变量保证了shell的正常运行。字符串是shell编程中最常用和最有用的数据类型(除了数字和字符串,没有其他的好用),字符串可以使用单引号,双引号,也可以不用引号。单引号和双引号的区别类似于PHP。单引号str='thisisastring'单引号字符串的限制:单引号内的任何字符都原样输出,单引号字符串内的变量无效。单引号字符串中不能出现单引号(对于单引号使用转义字符后不起作用)双引号my_name='szk'str="Hello,Iknowyourare\"$my_name\"!\n"双引号的优点:双引号中可以有变量,双引号中可以出现转义字符拼接字符串#!/bin/bash#文件:hello.shmy_name="szk"greeting="hello,"$my_name"!"greeting_1="你好,${my_name}!"echo$greeting$greeting_1bovenson@ThinkCentre:~/Tmp$bashhello.sh你好,szk!你好,szk!bovenson@ThinkCentre:~/Tmp$获取字符串长度#!/bin/bash#文件:hello.shmy_name="szk"echo${#my_name}bovenson@ThinkCentre:~/Tmp$bashhello.sh3提取子字符串#!/bin/bash#文件:hello.shslogon="同一个世界,同一个梦想!"echo${slogon:4:5}#这里4是起始下标,5是截取长度bovenson@ThinkCentre:~/Tmp$bashhello.sh世界查找字符串中的字符位置#!/bin/bash#文件:hello.shslogon="OneWorld,OneDream!"index=`exprindex"$slogon"W`#找到W字符echo${index}index=`exprindex"$slogon"Dra`#找到其中一个charactersD,r,aecho${index}bovenson@ThinkCentre:~/Tmp$bashhello.sh57字符串截取假设有一个变量var=http://www.aaa.com/123.htm方法一##截取,删除左边字符,保留右边字符echo${var#*//}#其中var是变量名,#是运算符,*//表示删除第一个//符号和左边的所有字符从左边#表示删除http://#结果是:www.aaa.com/123.htm方法二###截取,删除左边字符,保留右边字符echo${var##*/}###*/表示删除最后一个(最右边))从左边A/号和左边的所有字符#删除http://www.aaa.com/#结果是123.htm方法3#用%号截取,删除右边的字符,保留左边的字符echo${var%/*}#%/*表示从右边开始,删除第一个/符号和右边的字符#结果是:http://www.aaa.com方法四#用%%符号截取,删除右边的字符,保留左边的字符echo${var%%/*}#%%/*表示从右边开始,删除最后一个(最左边)的符号/andthecharactersontheright#结果为:http:method5#从左边开始的字符个数和字符个数echo${var:0:5}#其中0表示左边第一个字符,5表示字符总数。#结果是:http:method6#从左边第一个字符到结尾echo${var:7}#7表示从左边第8个字符开始到结尾#结果是:www.啊啊啊com/123.htm方法7#从右边的字符数开始,字符数echo${var:0-7:3}#其中0-7表示从右边第七个字符开始,3表示字符数。#结果为:123方法8#从右边第几个字符开始直到结束echo${var:0-7}#表示从右边第七个字符开始直到结束。#结果为:123.htm注意:左边第一个字符用0表示,右边第一个字符用0-1表示。数组bash支持一维数组(不支持多维数组)。数组元素的下标从0开始起始编号用于使用下标获取数组中的元素。下标可以是整数或算术表达式,其值应大于等于0。不能使用连续的下标,下标的范围不受限制。Shell中定义数组,用括号表示数组,数组元素之间用“空格”符号隔开:数组名=(值1值2...值n)例如:array_name=(value0value1value2value3)或者:array_name=(value0value1value2value3)也可以分别定义数组的每个组成部分:array_name[0]=value0array_name[1]=value1...array_name[n]=valuen读取数组和读取数组的一般格式元素值为:${数组名[下标]}例如:valuen=${array_name[n]}使用@符号获取数组中的所有元素,例如:echo${array_name[@]}#!/bin/bash#文件:hello.shslogon=("一个""世界""""一个""梦想")echo${slogon[0]}echo${slogon[1]}echo${slogon[@]}bovenson@ThinkCentre:~/Tmp$bashhello.shOneWorldOneWorld,OneDream!bovenson@ThinkCentre:~/Tmp$获取数组长度#!/bin/bash#File:hello.shslogon=("One""World"",""One""Dream!")#获取数组长度的方法与获取字符串长度的方法相同echo${#slogon[@]}echo${#slogon[*]}bovenson@ThinkCentre:~/Tmp$bashhello.sh55注释以“#”开头的行是注释,会被解释器忽略--------------------------#这是评论#作者:菜鸟教程#站点:www.runoob.com#口号:学习的不仅仅是技术,更是梦想!#--------------------------------------------#####用户配置区开始########这里可以添加脚本描述信息#######用户配置区结束#####每行加一个#符号太费力了。您可以将要注释的代码括在一对花括号中并将其定义为一个函数。如果没有地方调用这个函数,这段代码就不会执行。达到了和评论一样的效果。Parameter位置参数我们可以在执行Shell脚本的时候给脚本传递参数。脚本中获取的参数格式为:$nn代表一个数字,1是执行脚本的第一个参数,2是执行脚本的第二个参数,以此类推……位置参数包括命令名和命令行参数。在shell脚本中,根据它们在命令行中的位置来引用它们(比如命令a,b,c中参数a,b,c的位置)。不能通过赋值语句更改位置参数的值。bash的内置命令set可以修改除调用程序名(命令名)外的任何位置参数,但是在tcsh中,set内置命令不能改变位置参数的值,在脚本中使用$0$1获取位置参数#!/bin/bash#File:hello.shecho"Shell传递参数实例!";echo"执行文件名:$0";echo"第一个参数为:$1";echo"第二个参数是:$2";echo"第三个参数是:$3";bovenson@ThinkCentre:~/Tmp$bashhello.shv1v2v3v4v5v6v7Shell传参实例!执行的文件名:hello.sh第一个参数为:v1第二个参数为:v2第三个参数为:v3bovenson@ThinkCentre:~/Tmp$几个特殊字符用于处理参数字符描述$#传递给的数字脚本的参数数量$*以单个字符串显示传递给脚本的所有参数。例如$*用"括起来,则输出所有参数,形式为$1$2...$n。背景$@和$*一样,只是在使用的时候加引号,在引号中返回每个参数。比如$@用"括起来,那么所有的参数都会以$1$2..的形式输出。.$n。$-显示当前Shell使用的选项,与set命令功能相同。$?显示最后一个命令的退出状态。0表示没有错误,任何其他值表示错误。#!/bin/bash#File:hello.shecho"Shell传递参数实例!";echo"第一个参数是:$1";echo"参数个数是:$#";echo"传递的参数是一个characterStringdisplay:$*";bovenson@ThinkCentre:~/Tmp$bashhello.shv1v2v3v4v5v6v7Shell传递参数实例!第一个参数是:v1参数个数是:7传递的参数显示为字符串:v1v2v3v4v5v6v7$*和$@的区别是一样的:所有参数都用引号引起来。区别:只体现在双引号中。假设脚本运行时写了1、2、3三个参数,那么“*”就相当于“123”(传递一个参数),“@”相当于“1”“2”“3”(传递了三个参数)。基本运算符Nativebash不支持简单的数学运算,但可以通过其他命令实现,比如awk和expr,expr是最常用的。expr是一个表达式计算工具,可以完成表达式的求值运算。例如,两个数相加(注意使用反引号`而不是单引号'):#!/bin/bashval=`expr2+2`echo"两个数之和为:$val"表达式和运算有字符之间必须是空格,比如2+2是错误的,必须写成2+2,这和我们熟悉的大部分编程语言都不一样。完整的表达式应该用反引号括起来。注意这个字符不是常用的单引号,它在Esc键下。算术运算符运算符解释示例+加法`expr$a+$b`结果为30-减法`expr$a-$b`结果为-10*乘法`expr$a\*$b`结果为200/division`expr$b/\$a`,结果为2%`expr$b%$a`的结果为0=assignmenta=$b会将变量b的值赋给a==平等的。用于比较两个数,如果相同则返回true[$a==$b]返回false!=不等于。用于比较两个数,不相同则返回true[$a!=\$b]returntrue注意:条件表达式要放在方括号之间,并且必须有空格,例如:[$a==$b]是错误的,必须写成[$a==$b]乘号(*)前必须加一个反斜杠()才能实现乘法关系运算符Relationaloperatorsonly支持数字,不支持字符串,除非字符串的值是数字运算符说明-eq检查两个数字是否相等,等于返回true-ne检查两个数字是否相等,不等于返回true-gt检查左边的数字是否大于右边的数,如果是,则返回true-lt检查左边的数是否小于右边的数,如果是,返回true-ge检查左边的数是否大于或等于右边的数,如果是,则返回true-le检查左边的数是否小于或等于右边,如果是,则返回true布尔运算符运算符说明!不运算,表达式为真,返回假,否则返回真-oOR运算,一个表达式为真,则返回真-一个AND运算,两个表达式只有都为真才返回真逻辑运算符运算符说明&&逻辑与\\逻辑或字符串运算符运算符说明=检查两个字符串是否相等,相等则返回真!=判断两个字符串是否相等,不相等返回true-z判断字符串长度是否为0,为0返回true-n判断字符串长度是否为0,不为0返回truestr检查字符串是否为空,如果不为空则返回true,如[$a]文件测试操作符文件测试操作符用于检测Unix文件的各种属性。操作符描述示例-bfile检查文件是否为块设备文件,如果是则返回真。[-b$file]返回false。-cfile检查file是否为字符设备文件,如果是则返回true。[-c$file]返回false。-dfile检测文件是否为目录,如果是则返回真。[-d$file]返回false。-ffile检查文件是否为普通文件(既不是目录也不是设备文件),如果是则返回真。[-f$file]返回true。-gfile检查文件是否设置了SGID位,如果是则返回true。[-g$file]返回false。-kfile检测文件是否有粘性位(StickyBit),如果有则返回true。[-k$file]返回false。-pfile检查文件是否是命名管道,如果是则返回真。[-p$file]返回false。-ufile检查文件是否设置了SUID位,如果是则返回true。[-u$file]返回false。-rfile检查文件是否可读,如果是则返回真。[-r$file]返回真。-wfile检查文件是否可写,如果是则返回真。[-w$file]返回真。-xfile检查文件是否可执行,如果是则返回真。[-x$file]返回真。-sfile检查文件是否为空(文件大小是否大于0),不为空则返回true。[-s$file]返回true。-efile检查文件(包括目录)是否存在,如果存在则返回真。[-e$file]返回真。控制结构if...theniftest-commandthencommandsfiif[$(ps-ef|grep-c"ssh")-gt1];然后回声“真”;fiifelseifconditionthencommand1command2...commandNelsecommandfiifelse-ifelseifcondition1thencommand1elifcondition2thencommand2elsecommandNfiforloopforvarinitem1item2...itemNdocommand1command2...commandNdoneforvarinitem1item2...itemN;执行命令1;command2...done;#例子1forloopin12doecho"5Thevalueis:$loop"done#OutputThevalueis:1Thevalueis:2Thevalueis:3Thevalueis:4Thevalueis:5#Example2forstrin'Thisisastring'doecho$strdone#输出Thisisastringwhilestatementwhileconditiondocommandone#Example1#!/bin/shint=1while(($int<=5))doecho$intlet"int++"done#Output12345#Example2echo'Press
