配色: 字号:
shell脚本编程
2019-04-19 | 阅:  转:  |  分享 
  
循环语句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
献花(0)
+1
(本文系别让梦冬眠首藏)