shell脚本编程学习笔记(一)一、脚本格式vim shell.sh#!/bin/bash//声明脚本解释器,这个‘#’号不是注释,其余是注释#Program://程序内容说明#History://时间和作者二、shell变量的种类用户自定义变量:由用户自己定义、修改和使用与定义变量:Bash与定义的特殊变量,不能直接修改位置变量:通过命令行给程序传递执行的参数1、定义变量:变量名要以英文字母或下划线开头,区分大小写。
格式:变量名=值输出变量:echo $变量名2、键盘输入为变量内容:格式:read [-p "信息"] 变量名如:read -p "pewase input your name:" name3、不同引号对变量的作用双引号"":可解析变量,$符号为变量前缀。
单引号'':不解析变量,$为普通字符。
反引号``:将命令执行的结果输出给变量。
三、shell条件测试1、test命令:用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数字。
格式:test 条件表达式[ 条件表达式] (注意:[]与表达式之间存在空格)2、常见的测试类型:测试文件状态格式:[ 操作符文件或目录]如:if [ -d /etc ]thenecho "exists"elseecho "not exists"fi常见的测试操作符:-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 -ge 18 ]thenecho "已成年"elseecho "未成年"fi常用的测试操作符:-eq:等于-ne:不等于-gt:大于-lt:小于-le:大于或等于-ge:小于或等于逻辑测试格式:[ 表达式1 ] 操作符[ 表达式2 ]常用操作符:-a或&&:逻辑与-o或||:逻辑或!:逻辑非四、流程判断:1、条件判断a、if语句格式:单分支:if 条件表达式then 命令序列fi如:age=30if [ $age -ge 18 ]thenecho "已成年"elseecho "未成年"fi多分枝:if 条件表达式then 命令序列elif命令序列fi如:score=87if [ $score -lt 60 ];thenecho '60以下'elif [ $score -gt 60 ] && [ $score -lt 70 ];thenecho '60~70之间'elif [ $score -ge 70 ] && [ $score -lt 80 ];thenecho '70~80之间'elseecho '优秀'fib、case格式:case $变量名称in"第一个变量内容");;"第二个变量内容");;*)//最后一个变量内容都会用*来代表其它值,不包含前面的变量内容;;esac如:case $1 instart)echo 'start MYSQL service.';;stop)echo 'stop MYSQL service.';;*)echo "Usage: $0 start|stop";;esac2、循环控制跳出本次循环:continue结束循环:breaka、while循环格式:while [ 条件表达式]do程序段落done如:num=3while [ $num -gt 0 ]doecho $numnum=$(($num-1))doneb、for循环格式:for var in con1 con2 con3do程序段done如:for i in user0 user1 user2 user3echo $idone格式:for ((i=0;i<10 1++))do程序段done如:for ((i=0;i<10;i++))doecho $iuseradd user$iecho 123 | password --stdin_user$idone3、函数使用定义一个函数:在程序的最前面function 函数名(){}或者function 函数名{}如:function printit(){echo "your choice is $1"}调用:直接使用函数名如:printit 1传递参数:函数名参数1 参数1如:printit 2五、Shell文本操作1、Find查找命令的使用find . -name "*.text"//在当前目录下查找已txt为后缀的文件fing .-name "[a-z]*"//在当前目录下查找开头字母的文件find /etc -name "host*"//查找/etc目录下以host开头的文件find . -perm 755//在当前目录下查找属性为755的文件find -user root//在当前目录下查找属主为root的文件find /var -mtime -5//在/var下查找更改时间在5天内的文件find /var -mtime +3//在/var下查找更改时间在3天以前的文件find /etc -type d//查找文件类型为d的目录文件find /etc -typt l//查找文件类型为l的链接文件find . -size +1000000c//查找文件大小在1M的文件2、正则表达式^linux//以linux开头的$php//以php结尾的.//匹配任意单字符.+//匹配任意多个字符.*//匹配0个或多个字符[0-9a-z]//匹配[]内任意一个字符(linux)+//出现多次linux单词(web){2}//web出现了2次以上\//转译3、grep详解grep "li qq"*//在所有文件中查找li qq文件grep -c "file" a//在文件中查找有多少行匹配到filegrep -n "file" a//在文件中查找有多少行匹配file,同时显示行和行号grep -i "file" a//在文件中查找file,并不区分大小写grep -v "file" a//在文件中过滤掉file所在的行grep -E "2017:22:5[0-9]" a//在文件中查找在时间在2017:22:50到59的所在行grep -E "^[^210]" a//在文件中查找不号寒210的行grep -E "h*p" a//查找包含h和p的行grep -E "[5-8][6-9][0-3]" a//查找大于560小于893的行grep -E "^d" a//在文件中查找以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//查找文件中第一列和第七列cat file | awk '$0 !~ /192.168.31.25/'|grep "php"//匹配Ip 地址的统计,!~为不匹配例:for i in `cat /etc/passwd | head | awk -F:'{print $1}'`doecho $idone-F---以什么符号分割head---去前多少行,默认是10行5、sed行定位使用简介:sed是非交互式的编辑器。
它不会修改文件,除非使用shell重定向来保存结果。
默认情况下,所有的输出行都被打印到屏幕上。
sed -n '2'p file//只打印第二行,不打印其他行sed -n '1,4'p file//从第一行到第四行的记录sed -n '/los/'p file//打印匹配los的行sed -n '4,/los/'p file//打印从第四行到匹配los的之间所有行sed '1,2'd file//吧第一行和第二行全部删除6、Uniq行定位使用简介:uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。
语法uniq(选项)(参数)选项:-c或——count:在每列旁边显示该行重复出现的次数;-d或--repeated:仅显示重复出现的行列;-f<栏位>或--skip-fields=<栏位>:忽略比较指定的栏位;-s<字符位置>或--skip-chars=<字符位置>:忽略比较指定的字符;-u或——unique:仅显示出一次的行列;-w<字符位置>或--check-chars=<字符位置>:指定要比较的字符。