LinuxShell详解byvincenjiang2015.03.27内容•简介篇•基础篇•高级篇•工具篇•实用篇shell是一种特殊的程序,是用户与Linux系统内核间的接口,它解释运行由命令行或文件输入的命令,从而实现用户与内核间的交互。shell简介(1)简介篇数据统计服务监控自动化工具.....1、shell是什么2、shell能做什么简介篇shell简介(2)3、shell执行流程内部命令外部命令VSshell命令的一部分驻留在系统内存中不需要创建子进程如:cdexitechohistoryletz=x+y脚本文件或二进制程序需要时加载到内存需要创建子进程通常在/bin/usr/bin等目录下如:lsvicatz=`expr$x+$y`查看shell内部命令:manbuiltins查看命令类型:type[-a|-t|-p]命令名1)-a-all:显示所有可执行name的可能路径2)-t-type:file:外部命令;alias:别名;builtin:内建命令3)-p-path:显示命令的完整档名(外部指令)或显示为内建指令简介篇shell简介(3)4、shell命令类型declare-rvar(等价于readonlyvar)declare-inumberdeclare-aarraydeclare-ffunctiondeclare-xvar(会将变量export出来)2、变量引用强引用:${var},变量替换,防止单词分割弱引用:'${var}',不进行变量替换4、变量间接引用a变量的值是b变量的名字a=letter_of_alphabetletter_of_alphabet=zevala=\$$aechoNowa=$a#Nowa=z引用位置参数args=$##位置参数的个数lastarg=${!args}或lastarg=${!#}5、注意事项变量是不分类型的使用${var},而不是$var${var}与${var}的区别赋值前后一定不要有空格!3、变量赋值使用=:a=xxx使用$():a=$(uname-m)shell变量(1)基础篇1、变量定义6、常用变量shell变量(2)基础篇命令行参数:$0$1...${10}$#:命令行或位置参数的个数$*:所有位置参数,被作为一个单词。必须被引用$@:同$*,但每个参数都是一个独立的引用。必须被引用$!:在后台运行的最后的工作的PID(进程ID)$_:保存之前执行的命令的最后一个参数$?:命令,函数或者脚本本身的退出状态$$:脚本自身进程ID,常用来构造一个unique的临时文件名$BASH:指向Bash的二进制执行文件的位置FUNCNAME:当前函数的名字LINENO:当前行号HOME:用户的home目录PWD:所在的当前目录OLDPWD:所在的之前的目录PATH:指向Bash外部命令所在的位置SECONDS:脚本已经运行的时间(单位为秒)逻辑运算(1)1.1、文件测试操作基础篇-e:文件存在-f:为普通文件-s:文件长度为0-d:为目录-b:为块设备-c:为字符社保-p:为管道-L:为符号链接-S:为socket文件-r:有读权限-w:有写权限-x:有执行权限-nt:f1比f2新-ot:f1比f2旧1.2、整数比较-eq:等于-ne:不等于-gt:大于-ge:大于等于-lt:小于-le:小于等于1.3、字符串比较1.4、关系比较=:等于!=:不等于:小于,在[]中要用\:大于,在[]中要用\-z:字符串长度为0-n:字符串长度不为0-a:逻辑与-o:逻辑或&&:逻辑与||:逻辑或1、比较运算符2.1、test命令逻辑运算(2)test1=1&&echo'ok'#字符与运算符用空格分开test-d/etc/&&echo'ok'2.2、[]表达式[1-eq1]&&echo'ok'[2\1]&&echo'ok'#用在[]中,要加\[2-gt1-a3-lt4]&&echo'ok'#[]内部用-a-o[2-gt1]&&[3-lt4]&&echo'ok'#[]外部用&&||2.3、[[]]表达式[[23]]&&echo'ok'[[23&&45]]&&echo'ok'2、逻辑表达式[[]]是[]的扩充。能支持,运算,不需要转义,内支持逻辑运算符:||&&三种表达式,[[]]性能最高基础篇算术运算(1)1.2、位操作符1.3、混杂操作符基础篇1.1、算术操作符+:加法-:减法*:乘法/:除法**:幂运算%:取模+=:加等于-=:减等于*=:乘等于/=:除等于%=:取模等于:左移1位=n:左移n位:右移=n:右移n位&:按位与&=:按位与赋值|:按位或|=:按位或赋值~:按位非!:按位否^:按位异或^=:按位异或赋值,:逗号运算符逗号操作符可连接2个或多个算术运算,所有的操作都会被执行,但只有最后一个操作作为结果。主要用在for循环中。lett1=((5+3,7-1,15-4))#t1=11lett2=((a=9,15/3))#t2=5a=91、算术运算符算术运算(2)2、算术表达式expr命令r=`expr4+5`r=`expr40-5`r=`expr4\*5`r=`expr40/5`r=`expr100%43`注:expr不支持乘幂$(())命令r=$((4+5))r=$((40-5))r=$((4*5))r=$((40/5))r=$((100%43))r=$((2**3))$[]命令r=$[4+5]r=$[40-5]r=$[4*5]r=$[40/5]r=$[100%43]r=$[2**3]let命令letr=4+5letr=40-5letr=4*5letr=40/5letr=100%43letr=2**3注:不带引号时,=两边不能有空格基础篇数字常量letdec=32echodecnumber=$dec#32其它进制:base#num(2=num=64)letbin=2#111100111001101echobinarynumber=$bin#31181letb32=32#77echobase-32number=$b32#231letb64=64#@_echobase-64number=$b64#4031注:64进制表示法中每位数字都必须在限制字符内:10个数字+26个小写字母+26个大写字母+@+_基础篇10进制:默认letoct=032echooctalnumber=$oct#268进制:以'0'(零)开头lethex=0x32echohexnumber=$hex#5016进制:以'0x'或'0X'开头基础篇控制流程(1)1、条件语句if条件表达式;thencommandAfiif条件表达式thencommandAfiif条件表达式;thencommandAelif条件表达式;thencommandBelsecommandCfiifcmpab&/dev/null#阻止输出thenechoFilesaandbareidentical.elseechoFilesaandbdiffer.fiifgrep-qBashfile;then#-q阻止输出echoFilecontainsatleastoneBash.fiiftest-z$1;thenechoNocommand-linearguments.fiif[[-e$file]];thenechoPasswordfileexists.fi1.1、语法结构1.2、实例基础篇控制流程(2)2、for语句forargin[list]docommanddoneforargin[list];docommanddonefor((赋值;条件;运算语句))docommanddone#[list]参数加双引号是为了阻止单词分离forargin$var1$var2...$varN;doecho${arg}done#忽略[list]时,循环操作$@(参数列表)foradoecho-n$adone#支持通配符forfilein[jx]*;dorm-f${file}done#支持命令替换foriin$(seq10);doecho$i;done;for((i=1;i=10;i++));doecho$i;done;2.1、语法结构2.2、实例基础篇控制流程(3)3、while语句3.1、语法结构while[condition];docommanddonewhile[condition];docommanddonewhile((逻辑表达式));docommanddonevar0=0LIMIT=10while[$var0-lt$LIMIT];dovar0=`expr$var0+1`done#一个while循环可以有多个判断条件,但是只有最后一个才能决定是否退出循环var1=unsetprevious=$var1whileechoprevious-variable=$previousechoprevious=$var1[$var1!=end];doechoInputvariable#1(endtoexit)readvar1echovariable#1=$var1done((a=1))while((a=10));do((a+=1))done3.2、实例基础篇控制流程(4)4、util语句4.1、语法结构until[condition]docommanddoneuntil[condition];docommanddone#循环接受键盘输入,直到输入end跳出END_CONDITION=enduntil[$var1=$END_CONDITION]echoInputvariableecho($END_CONDITIONtoexit)readvar1echovariable#1=$var1echodone4.2、实例4.3、循环控制(breakcontinue)forouterloopin123457;doforinnerloopin1234512;doif[$innerloop-eq3];thenbreak2#直接跳出外部循环fidonedone#breakn可退出N层循环(n=1)forouterinIIIIIIIVV;doforinnerin12345;doif[$inner-eq3];thencontinue2#到outer循环fidonedone#continuen去掉n层循环代码(n=1)基础篇控制流程(5)5、case语句5.1、语法结构case$varin$cond1)command1;;$cond2)command2;;*)other;;esaccase$Keypressin[[:lower:]])echoLowercaseletter;;[0-9])echoDigit;;start|begin)*)echoPunctuation,whitespace,orother;;esac#*(任意字串)?(任意字符)[abc](abc其中之一)[a-n](从a到n的任一字元)|(多重选择)5.2、实例6、select语句6.1、语法结构selectvar[inlist]docommandbreakdone#若忽略[inlist],则用命令行参数或函数参数列表selectchinbeginendexit;docase$chinbegin)echostartsomething;;end)echostopsomething;;exit)echoexit;break;;*)echoIgnorant;;esacdone6.2、实例捕捉一个文件/命令/程序/脚本/代码块的输出,将其作为输入发送到另一个文件/命令/程序/或脚本中。2、基本概