循环语句forname[inword];dolist;doneforiin`ls.result`;d ocat$i;donefor((expr1;expr2;expr3));dolist;done for((i=0;i<100;i++));doecho$i;donewhilelist;dolist;done whilereadline do echo$line donest;done注释#行注释(#前要有空格)echo$msg#printmessage块注释:<ENTecho$msgCOMMENTcomment(){ echo$msg}正则表达式基础元字符. 匹配任何单个字符。?$ 匹配行结束符。^匹配一行的开始。 匹配0或多个正好在它之前的那个 字符。+ 匹配1或多个正好在它之前的那个字符。? 匹配0或1个正好在它之前的那个字符。\{i\}\{i,j\}匹配指 定数目的字符。\ 这是引用符,转义;[]? [c1-c2]匹配括号中的任何一个字符。[^c1-c2 ]\<\> 匹配词(word)的开始(\<)和结束(\>)。\(\) 将\(和\)之间的表达式定义为“组”( group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用\1到\9的符号来 引用。|将 两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her)正则表达式举例HTML标签<[^ >]> 匹配由26个英文字母组成的字符串^[A-Za-z]+$Email地址\w+([-+.]\w+)@\ w+([-.]\w+)\.\w+([-.]\w+)URL[a-zA-z]+://[^\s]管道和重定向管道可以 把一条命令的输出作为另一条命令的输入Command1|Command2 返回值是最后一个命令的返回值重定向 wc–l/etc/passwd>a.txt wc–l/etc/passwd>>a.txt wc –la.txt2>&1(./command&>a.txt) exec5<>a.txt echo“hello”>&5 <&- >&-作业控制将当前 任务挂起,返回job_idfg job_id 把后台作业放到前台执行bg job_id 把作业放到后台执行vib.sh [1]+Stoppedvimb.shbg1[1]+vimb.s h&fg1vimb.sh自定义函数functionfoo() #foo为函数名{ locala= $1; #局部变量 echo$a; return0; #返回值 }foo“cool!” #函 数调用echo$? #打印返回值自定义函数–16进制转点分十进制a(){???????localstr= $1???????echo-n$((16#${str:0:2}))???????str=${str:2}???????i f["x$str"="x"]???????then??????????????echo;return?????? ?else??????????????echo-n".";a$str???????fi}#Usagea"DDB 14CCF"整数计算id++id--++id–id-+!~/% 计算<<>> &^| 位操作<=>=<>==!= 比较&&|| 逻辑操作expr?expr :expr 三元操作符==/=%=+=-=<<=>>=&=^=|=赋值操作符y=2000 闰年计算echo??$((y%4==0&&y%100!=0 ||y%400==0))((y++)) 自增1tmp=$((16#a)) 进制转换浮点运算echo“sc ale=5;3/7"|bc–l .42857echo"100.43KB20.12KB"|awk''{print$ 1-$2}'' 80.31echo"ibase=16;F"|bc-l 15简单字符串处理x=abcd${#x} #获取字串长度 4exprindex??$x“b“ #获取子串所在偏移 2exprindex??$ x"a“ #获取子串所在偏移 1echo${x:1} #获取子串bcdecho${x:2} cdecho${x:0:2} ab简单的字符串处理(续)x=aabbaarealwwvvwwecho“${x%w w}“ #截去尾部最短匹配 aabbaarealwwvvecho“${x%%ww}“ #截去尾部最长匹配 aa bbaarealecho“${x##aa}“ #截去头部最长匹配 lwwvvwwecho“${x#aa}“ # 截去头部最短匹配bbaarealwwvvwwx=abcdabcdecho${x/a/b} #只替换一 个bbcdabcdecho${x//a/b} #替换所有bbcdbbcd简单字符串处理–实际应用截去域名尾部 name=jx-sys-superdb.jx.baidu.comecho${name%%.} jx-sys-superdb截取日期str=20081011year=${str:0:4}替换echo${n ame//jx/tc}tc-sys-superdb.tc.baidu.com随机字符串生成typeset-rDEFAUL T_STR_LEN=5typeset-radict=(abcdefghijklmnopqr stuvwxyz)functionget_random_letter(){ echo-n${dict [$((RANDOM%${#dict[]}))]} return0}functionget_random_strin g(){ localslenstr [$#-eq1]&&slen=$1||slen=$DEFAULT_ STR_LEN for((i=0;iget_random_letter` done echo$str return0}get_random_stri ng$1调试-x-n是只语法检查而不执行任何命令-e是脚本发生第一个错误时就中止脚本运行,即当一个命令返回非零值时退 出脚本(除了until或whileloops,if-tests,listconstructs)--posix是更 改Bash或脚本的行为,使之符合POSIX标准Shell伪信号:EXIT,ERR,DEBUG调试(续)+typeset -rDEFAULT_STR_LEN=5+typeset-ra''dict=(abcdefghijk lmnopqrstuvwxyz)''+get_random_string2+localsle nstr+''[''1-eq1'']''+slen=2+((i=0))+((i+get_random_letter++echo-nt++return0+str=t+((i++)) +((istr=tk+((i++))+((i#!/bin/bashtrap"print_OK"3functionprint_OK(){ech oOK}while:do:done发送信号:kill-3pid屏蔽信号:trap“” 3其他常用内置命令execcommand#用command替换当前进程typels lsisaliasedt o`ls--color=tty`:空命令 while: do cmd done if[list]; then:;elseechofalse;fiShell脚本编程公众号“ziyuanku927”Sh ell是用户和内核的一个接口。什么是Shell读取输入并解释命令替换特殊字符(通配符,历史命令符)设置管道,重定向,后台 处理处理信号环境控制解释型编程语言ShellatbaiduOPSARDQA自动化部署,统计,监控,系统信息 采集,测试,文本处理helloworld!#!/bin/bashecho“helloworld!”$chm od+xa.sh$./a.shhelloworld!变量变量不分类型(没有int,char,string) 不需要声明,直接使用赋值:name=value(左右两边不能有空格)使用:$name ${name}foo=hecho ${foo}ello变量的作用域默认全局作用域(仅当前shell可见)local限定函数局部变量 functiona (){localmsg;}使用export导出变量,让子shell可以继承exportvar=1sourc e或.(dot)在当前shell下执行脚本source./config.sh变量分类自定义变量环境变量(s et命名可查看)$PATH,$IFS,$PS1,$PWD,$LINENO位置参数(PositionalParame ters) $1$2$3…${10}特殊参数(SpecialParameters)$#:位置参数的数量 $:所有位置参数的内容($1$2…)$@:所有位置参数的内容(“$1”“$2”…)$ ?:命令执行后返回的状态$$:当前进程的进程号$!:后台运行的最后一个进程号$0:当前执行的进程名 玩转变量使用eval实现变量的间接引用x=''abcdef''y=''$x''echo$y$xevalecho$y abcde玩转变量(续)${!p} #双重引用 a=1 b=''a'' echo${!b}1${!p } #返回所有以p开头的变量 echo${!P} PATHPIPESTATUSPPIDPS1PS2PS4 PWD${p:-word} #如果变量p不存在,返回"word”${p:=word} #如果变量p不存在,返回"wor d",并将p的值设为"word"${p:?word} #如果变量p不存在,将"word"打入STDERR${p:+word } #如果变量p存在,返回"word"玩转变量(续)if[${ret:=1}-ne0] then echo “NO” exit fi引号迷雾双引号使用双引号可解释$符号,反引号和反斜线等特殊字符 echo“$ms g” =>显示msg变量值单引号与双引号类似,不同的是shell会忽略任何特殊符号 echo‘$msg’ => 显示$msg 反斜杆 \c==‘c’反引号(命令替换) 用于执行系统命令并输出到变量 echo?The? date?and?time?is?`date`?几种括号(list)list将在一个子shell中执行,不会对当前she ll产生影响,返回list的exit值{list;}可以作组合命令用,list将在当前shell中被执行,list结尾处 必须要有新行或‘;’号,返回list的exit值,list前后必须有空格((expression))算术计算[][[ ]]分支测试数组name=(value1...valuen)此时下标从0开始name[index]=valueu nsetname或name=数组下标的范围没有任何限制,同时也不必使用连续的分量$A=(abcdef)$A [3]=bb$echo${A[0]} #取第一个元素a$echo${A[@]} #取全部元素abcdef$echo${#A[@]} #取得数组元素的个数4 数组(续)遍历数组: total=${#A[]}for((i=0;idone分支语句iflist;thencommand;[eliflist;thencommand; ]...[elsecommand;] ficase$wordin[a-z])list; ; )default;;esac[$#-eq1]&&slen=1||slen=0条件测试对文 件、字符串和数字使用test命令。test一般有两种格式:testcondition或[condition](注意空格) if[$str=“a.txt”];then echo“OK" fi直接测试命令: ifgrepabca.txt&>/dev/null;thenecho“Bingo!”fi条件测试(续)推荐使用[[]]进行条件测试 if[[“x$str”==“xa.txt”&&-fb.txt]] then cmd; fi-f-d-z……manbashCONDITIONALEXPRESSIONS条件测试–数值比较if[$a–lt0]then echoOKfi推荐使用(()) if((a>0))then echoOK fi |
|