shell脚本编程学习笔记(一)一、脚本格式vimshell.sh#!/bin/bash//声明脚本解释器,这个‘#’号不是注释,其余是注释#Program://程序内容说明#History://时间和作者二、shell变量的种类用户自定义变量:由用户自己定义、修改和使用与定义变量:Bash与定义的特殊变量,不能直接修改位置变量:通过命令行给程序传递执行的参数1、定义变量:变量名要以英文字母或下划线开头,区分大小写。格式:变量名=值输出变量:echo$变量名2、键盘输入为变量内容:格式:read[-p信息]变量名如:read-ppewaseinputyourname:name3、不同引号对变量的作用双引号:可解析变量,$符号为变量前缀。单引号'':不解析变量,$为普通字符。反引号``:将命令执行的结果输出给变量。三、shell条件测试1、test命令:用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数字。格式:test条件表达式[条件表达式](注意:[]与表达式之间存在空格)2、常见的测试类型:测试文件状态格式:[操作符文件或目录]如:if[-d/etc]thenechoexistselseechonotexistsfi常见的测试操作符:-d:测试是否为目录-e:测试目录或文件是否存在-f:测试是否为文件-r:测试当前用户是否有读权限-w:测试当前用户是否有写权限-x:测试当前用户是否有执行权限-L:测试是否为符号链接文件字符串比较格式:[字符串1=字符串2][字符串1!=字符串2][-z字符串]如:read-p'name:'nameread-p'pass:'passif[$name='admin']&&[$pass='123']thenecho'登录成功'elseecho'登录失败'if常用的测试操作符:=:字符串内容相同。!=:字符串内容不同。-z:字符串内容为空。整数值比较格式:[整数1操作符整数2]如:age=30if[$age-ge18]thenecho已成年elseecho未成年fi常用的测试操作符:-eq:等于-ne:不等于-gt:大于-lt:小于-le:大于或等于-ge:小于或等于逻辑测试格式:[表达式1]操作符[表达式2]常用操作符:-a或&&:逻辑与-o或||:逻辑或!:逻辑非四、流程判断:1、条件判断a、if语句格式:单分支:if条件表达式then命令序列fi如:age=30if[$age-ge18]thenecho已成年elseecho未成年fi多分枝:if条件表达式then命令序列elif命令序列fi如:score=87if[$score-lt60];thenecho'60以下'elif[$score-gt60]&&[$score-lt70];thenecho'60~70之间'elif[$score-ge70]&&[$score-lt80];thenecho'70~80之间'elseecho'优秀'fib、case格式:case$变量名称in第一个变量内容);;第二个变量内容);;*)//最后一个变量内容都会用*来代表其它值,不包含前面的变量内容;;esac如:case$1instart)echo'startMYSQLservice.';;stop)echo'stopMYSQLservice.';;*)echoUsage:$0start|stop;;esac2、循环控制跳出本次循环:continue结束循环:breaka、while循环格式:while[条件表达式]do程序段落done如:num=3while[$num-gt0]doecho$numnum=$(($num-1))doneb、for循环格式:forvarincon1con2con3do程序段done如:foriinuser0user1user2user3echo$idone格式:for((i=0;i101++))do程序段done如:for((i=0;i10;i++))doecho$iuseradduser$iecho123|password--stdin_user$idone3、函数使用定义一个函数:在程序的最前面function函数名(){}或者function函数名{}如:functionprintit(){echoyourchoiceis$1}调用:直接使用函数名如:printit1传递参数:函数名参数1参数1如:printit2五、Shell文本操作1、Find查找命令的使用find.-name*.text//在当前目录下查找已txt为后缀的文件fing.-name[a-z]*//在当前目录下查找开头字母的文件find/etc-namehost*//查找/etc目录下以host开头的文件find.-perm755//在当前目录下查找属性为755的文件find-userroot//在当前目录下查找属主为root的文件find/var-mtime-5//在/var下查找更改时间在5天内的文件find/var-mtime+3//在/var下查找更改时间在3天以前的文件find/etc-typed//查找文件类型为d的目录文件find/etc-typtl//查找文件类型为l的链接文件find.-size+1000000c//查找文件大小在1M的文件2、正则表达式^linux//以linux开头的$php//以php结尾的.//匹配任意单字符.+//匹配任意多个字符.*//匹配0个或多个字符[0-9a-z]//匹配[]内任意一个字符(linux)+//出现多次linux单词(web){2}//web出现了2次以上\//转译3、grep详解grepliqq*//在所有文件中查找liqq文件grep-cfilea//在文件中查找有多少行匹配到filegrep-nfilea//在文件中查找有多少行匹配file,同时显示行和行号grep-ifilea//在文件中查找file,并不区分大小写grep-vfilea//在文件中过滤掉file所在的行grep-E2017:22:5[0-9]a//在文件中查找在时间在2017:22:50到59的所在行grep-E^[^210]a//在文件中查找不号寒210的行grep-Eh*pa//查找包含h和p的行grep-E[5-8][6-9][0-3]a//查找大于560小于893的行grep-E^da//在文件中查找以d开头的行grep-E^[^d]a//在文件中查找不是以d开头的行4、awk命令:简介:awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。格式:awk'{pattern+action}'{filenames}pattern:查找内容action:匹配规则awk'{pring$0}'access.log//查找文件中的每一列awk'{print$1\t$7}'access.log//查找文件中第一列和第七列catfile|awk'$0!~/192.168.31.25/'|grepphp//匹配Ip地址的统计,!~为不匹配例:foriin`cat/etc/passwd|head|awk-F:'{print$1}'`doecho$idone-F---以什么符号分割head---去前多少行,默认是10行5、sed行定位使用简介:sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。选项功能-e进行多项编辑,即对输入行应用多条sed命令时使用-n取消默认的输出-f指定sed脚本的文件名sed-n'2'pfile//只打印第二行,不打印其他行sed-n'1,4'pfile//从第一行到第四行的记录sed-n'/los/'pfile//打印匹配los的行sed-n'4,/los/'pfile//打印从第四行到匹配los的之间所有行sed'1,2'dfile//吧第一行和第二行全部删除6、Uniq行定位使用简介:uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。语法uniq(选项)(参数)选项:-c或——count:在每列旁边显示该行重复出现的次数;-d或--repeated:仅显示重复出现的行列;-f栏位或--skip-fields=栏位:忽略比较指定的栏位;-s字符位置或--skip-chars=字符位置:忽略比较指定的字符;-u或——unique:仅显示出一次的行列;-w字符位置或--check-chars=字符位置:指定要比较的字符。uniq-cfile//打印紧挨的重复行出现的次数uniq-dfile//只打印重复的行awk'{print$1}'/var/log/httpd/access_log|sort|uniq-c//把apache网站的所有访问ip全部统计出来,并打印出统计次数。7、spli行定位简介:可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志。语法:split(选项)(file)PREFIX选项:-b:值为每一输出档案的大小,单位为byte。-C:每一输出档中,单行的最大byte数。-d:使用数字作为后缀。-l:值为每一输出档的列数大小。PREFIX:代表前导符,可作为切割文件的前导文件。split-2filespt//生成fileab,fileac....fileai等多个文件,把a文件每行分割成一个文件,每个文件的前缀都是以file开头的。