指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710Linux下Bash程序开发本教程适用于已经学习Linux指令的学员,利用Bash编程有助于日常服务器的管理的便捷。编者寄予:希望多动手,开动脑筋,克服编程的恐惧心理,Linux下Bash编程无非就是这么几条语句,有志者事竟成。指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710怎样写shell脚本•使用任何编辑工具编写shell脚本例如vi–#!/bin/bash#在第一行放置头格式说明•在写完shell脚本之后,设置脚本执行权限–chmod+xyour-script-name–chmod755your-script-name•执行你的脚本做测试–bashyour-script-name–shyour-script-name–./your-script-name指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710shell中的变量•Linux(Shell)中有两种类型的变量:–系统变量:由Linux系统本身维护,通常为大写的变量名–用户定义变量(UDV):由用户创建和维护,通常小写•查看系统变量可以通过Linux指令set罗列出来•在调用变量时,在名称前加以$(美元符号)–echo$USERNAME–echo$HOME指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710彩色Shell输出•echo-e指令可以在控制台输出彩色的字符。•色彩分为前景色和背景色,十位数的数字3或4表示–前景色30-37(以3x代表)–背景色40-47(以4x代表)•个位数表示为色彩3300((黑黑色色))、、3311((红红色色))、、3322((绿绿色色))、、3333((黄黄色色))、、3344((蓝蓝色色))、、3355((洋洋红红))、、3366((青青色色))、、3377((白白色色))。。•前景色和背景色个位数不要一致,否则看不见任何信息(可以用在密码输入处)指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710彩色Shell输出二•使用格式:–\033[前景色;背景色m#同时更改前/背景色–\033[前景色m#只更改前景色–\033[背景色m#只更改背景色–\033[0m#还原所有的前/背景色,最后部分一定要还原色彩•echoYouareloginto\033[34;40mbluefox\033[0msystem–打印蓝色的bluefox•下面的代码用在防止密码被窥探echoPleaseinputapassword\033[34;44mreadPASSWD;echo\033[0mechoPASSWD|opensslmd5指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710如何定义用户自己的变量•要定义UDV可以使用下面的语法:变量名=值(注意:等号之间没有空格)•通过=将右边的值赋给左边的变量no=10#正确10=no#错误,值必须在右边vech=Bus#定义一个'vech'变量其值为'Bus'n=30#错误,等号右边存在空格n=20#错误,等号左边存在空格指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710变量名的命名规则•变量名必须以字符或者_(下划线)开头•重复一次,=等号两边不能有空格•变量名区分大小写•可以定义NULL值–vech=#等号右边没有任何值–vech=#引号中没有任何的空格•在变量名中不要使用?(问号),*(星号)指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710如何打印UDV•要打印或调用变量时,使用下面的语法$变量名#在定义变量或赋值的时候不要$#定义变量vech=Bus#显示变量echo$vech•不要使用echovech,这样只会把vech当成一个字符串的值打印出来,也就是在屏幕中输出vech本身指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710echo命令•使用echo命令可以显示文本或变量的值•echo[选项][字符,变量...]•选项-n不换行输出,默认echo一次换一行,用在持续的打印输出-e启用转义字符解析\a响铃\b退格\c去除尾部的新行\n新的一行\r回车\t水平制表符功能\\斜杠echo-eAnappleadaykeepsaway\a\t\tdoctor\n指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710shell中数学计算•使用下面的语法执行数学运算,注意中间都存在空格,一次只能处理两个数字语法:expr操作数1数学计算操作数2expr1+3#加法计算得到4expr10/2#除法计算得到5expr20%3#求余数得到2expr10\*3#乘法特殊,由于*星号为通配符之一,#必须对*使用转义符,等到*本身echo`expr6+3`#显示结果,注意`(斜点)的使用,代表#先行执行Bash命令•如果使用echoexpr6+3或者echo'expr6+3'将显示expr6+3字符本身指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710引号的使用•我们来区分一下引号(双引号)对\做转义,对$的变量做解析''(单引号)其中的内容不做任何修改``(斜点)用来执行命令•请观察下面的命令区别–echoTodayisdate#输出Todayisdate–echoTodayis`date`#输出Todayis及日期–echo'Todayis`date`'#原样输出Todayis`date`指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710退出和退出状态•在Linux执行指令,它将返回两种类型的值,用来判断此前执行的命令或shell脚本成功与否。–返回0,命令执行成功–返回任何不为0,命令不成功或者在执行中有一些错误•这些值称呼为退出状态,可以通过$?检查退出状态–rmnonexist-file–echo$?–ls–echo$?指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710read语法•read命令用来获得用户通过键盘输入的数据,并将数据保存到变量中•语法:read变量1,变量2,...变量NechoYourfirstnamereadfnameechoHello$fname,Letsbefriend!指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710通配符的使用•*星号代表任何的字符出现0到多次ls/lib/*.so#任何以.so为后缀ls/lib/lib*.so.*#以lib开头+.so.+任何其他后缀•?问号代表一个而且只有一个任何字符ls/lib/lib??.so.?#此文件名长度为10•[]括号内提供的字符选择一个ls/lib/lib[bcp]*.so#b,c,p选一,libb,libc,libp•[-]括号内一段字符,0-9数字,a-z小写,A-Z大写ls/lib/lib[b-p]*.so#从b到p选一•[^]括号内的都排除掉,[^bc]除了b和c以外的其他全部ls/lib/lib[^c]*.so.*指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710一行中执行多个命令•语法:以;分号间隔每条命令–命令1;命令2;....;命令Ndate;who指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710命令行的处理•Linux绝大多数命令可以带参数和选项,请识别下面的命令带有多少参数#命令#参数总数($#)lsfoo#1cpyy.bak#2date#0tail-10myf#2mailraj#1sort-r-nmyf#3指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710命令行参数•根据前面观察的结果–$#保存着命令后面所带的参数的总数–$*或者$@将命令后的所有参数作为一个字符串保存指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710位置参数•观察下面的命令•位置1处代表程序名本身由$0表示•位置2,3处代表参数部分起始以$1,$2指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710shell脚本中条件判断•返回Shell中0(代表True)或1(False)结果–if/then结构–test或者[...]执行shell测试,返回shell结果•Bash2.02版本以上[[...]]•返回常规编程语言格式的结果–((...))和let...还可以做数字的比较•bc指令提供我们对条件的测试指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710bc指令的测试•bc指令可以用在对数学和逻辑测试5/2#5除以2等于2#Shell中返回整数5%2#5除以2余多少?10||1#逻辑或运算110099#100大于99吗?1#YES99100#99大于100吗?0#NOquit#退出指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710test命令或[]•[]中写入测试条件,注意条件和开/闭中括号之间要保留空格•初学者使用此模式时,要特别注意,0代表TRUE,可以理解成没有错误,而1代表FALSEif[0];thenecho0istrueelseecho0isfalsefi指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710测试条件•字符的比较数字的比较代表意思==-eq相等-gt大于-lt小于!=-ne不等于=/=-le/ge小于等于/大于等于多个条件测试时-a并且,逻辑与-o或者,逻辑或指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710测试文件/文件夹属性•常见判断-a#文件是否存在-b#文件是否为块设备-d#文件是否为目录-s#文件大小是否为0-r#文件是否具有可读权限-w#文件是否具有可写权限-x#文件是否具有可执行权限•manbash可以得到更为详尽的帮助指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710if...else...fi•语法:if[条件判断]then命令1#上面条件判断结果为0,代表TRUE命令2else命令3#上面条件判断结果为1,代表FALSE命令4fi指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710&&和||•&&与运算,||或运算,不能使用在[...]之间,只能使用在[[...]]之间[-e/etc/passwd&&-e/etc/group]–-bash:[:missing`]'#提示缺少[]•单独使用时,&&代表之前的条件TRUE时,||代表之前的条件FALSE。[ping-c2$SERVER&/dev/null]&&\echo$SERVERisonline||\echo$SERVERisdown指导老师:杨坤QQ:12238747蓝狐教育系统培训中心0731-84125710[[...]]测试•[[...]]测试相比[...]更为实用些,这是一个扩展测试命令•使用[[...]]相对[...]而言,可以防止在脚本中出现很多逻辑上的错误信息,比如&&,||,和•在[[...]]中自动计算十进制和8/16进制的值。decimal=15octal=017#八进制的数字15hex=0x0f#16进制的数字15if[$decimal-eq$octal];thenecho$decimalequal$octalelseecho$decimalnotequal$octalfi将上面的[]改为[[]]再试试指导老师:杨坤QQ:12238747蓝狐教育系统培训中心