您的位置:首页 > 运维架构 > Shell

Shell编程

2016-05-04 13:57 281 查看

1.Shell 环境变量:

1》环境变量定义和导出格式:①name=value; export name②name=value export name

2.用户常用的系统环境变量

1》PWD:当前用户的工作目录2》HOME:用户主目录的路径全名3》LOG NANME:用户的登录名4》SHELL:当前所使用的SHELL5》PATH:搜索执行码的路径6》PS1:命令行提示符7》LANG:定义语言编码方式8》EXINIT:保存vi编辑初始化设置选项,如设置行号,设置tab为4个空格,设置方法如下:EXINIT='set nu tab=4';export EXINIT

3.Shell中的符号及含义

1》*:匹配0个和多个字符组成的串2》?:匹配单个字符3》[]:匹配的字符范围或列表。例如,$ls [a-c]*,将列出以a~c范围内字符开头的所有文件,$ls [e,m,t]*将列出以e、m或t开头的所有文件。4》>:为重定向覆盖输出5》<:为重定向输入6》》:为重定向添加7》|:管道命令,左边的输出作为右边的输入,如:ls *.c|wc -l。8》$#:传送给命令shell的参数序号9》$-:在shell启动或使用set命令时提供选项10》$?:上一条命令执行后返回的值11》$$:当前shell的进程号12》$!:上一个子进程的进程号13》$@:所有的参数,每个都用双引号引起,以("$1" "$2" ...)的形式保存所有输入的命令行参数14》$*:所有的参数,用一个双引号引起整体,以("$1 $2..")的形式保存所有输入的命令行参数15》$n:位置参数值,n表示位置16》$0:当前shell名17》$:引用某个变量18》#:注释符号19》&:后台命令20》&&(布尔与)与条件符号:仅当其左边命令执行成功后,才执行右边的命令21》||(布尔或)或条件符号:仅当其左边命令不成功时,才执行右边的命令22》!(布尔非):反转命令的退出状态值23》;:命令分隔符,在一个命令行中一次执行各个命令24》"...":双引号表示除\、$、'和"外,由双引号引起来的字符为普通字符25》'...':单引号引起来的字符均作为普通字符26》`...`:命令替换,倒引号引用起来的字符串作为shell命令执行27》~:表示主目录28:》.(内置句点):执行命令29》..:表示上级目录30》[](内置表达式):计算算术表达式的值,相当于test31》{}:用来封装函数体32》\:表示转义字符33》<<:重定向输入34》<<-:重定向输入,输入去掉行首的tab键

4.例子:bash.sh脚本用例

file=`basename $0`echo "file name:$file"执行:chmod u+x bash.sh输出:file name:base.sh补充说明:chmod u+x bash.sh:u该文件属者,+表示增加权限,x表示可执行basename:为basename指定一个路径,basename命令会删除所有的前缀包含最后一个slash('/')字符,然后将字符串显示出来。比如:basename /usr/bin/sort 输出:"sort"

5.Shell变量

1》变量特点①无需定义,可直接使用②shell大小写敏感③$为shell保留字符,变量被其他变量引用时前面需要加$④变量赋值"="两边是没有空格的,不然会带来错误⑤如果在赋值语句中,右边没有任何信息,那么这个变量为一个空字符串,另外仅定义声明而没有赋值的变量,默认也是一个空字符串⑥shell只有两种类型,一种是整型数字,一种字符串。整型数字必须所有位都为数字,类型shell解析器自动识别⑦如果一个变量中含空格、制表位、换行符,则要用双引号引起,不然会出错⑧字符串左右应加双引号""⑨shell内置9个位置变量,$1~$9
2》引用变量三种方法①使用双引号引用变量,比如:"$var"②使用大括号引用变量,比如:{$var}③直接引用变量,比如:$var
3》变量的赋值四种方法①直接赋值user=meng #字符串赋值null= #空串赋值number=123 #数字赋值②变量赋值var1=$uservar2=$var1③参数置换方式赋值${变量:-字符串} #如果变量被设定并非空,则返回变量的值,否则是字符串的值${变量:+字符串} #如果变量被设定并非空,则返回字符串值,否则是变量的值(即空值)${变量:=字符串} #如果变量被设定并非空,则返回变量的值,否则是字符串的值,同时变量被设定成字符串${变量:?字符串} #如果变量被设定并非空,则返回变量的值,否则返回报错
4》位置变量Shell脚本可以向脚本命令行传递参数。在shell中,$0表示执行的程序名,$1~$9是传递的命令行参数,shell脚本最多能传递9个参数,$1~$9称为shell内置的位置变量。shift会让位置参数左移一位,即$2 变$1、$3变$2。例子:arg.sh,测试位置变量变化效果#!/bin/shecho NO.0 $0echo NO.1 $1ehco NO.2 $2ehco NO.3 $3
shiftecho shiftingecho NO.0 $0echo NO.1 $1ehco NO.2 $2ehco NO.3 $3执行:chmod u+x ./arg.sh arg1 arg2 arg3 arg4结果:echo NO.0 ./arg.shecho NO.1 arg1ehco NO.2 arg2ehco NO.3 arg3shiftingecho NO.0 ./arg.shecho NO.1 arg2ehco NO.2 arg3ehco NO.3 arg4
5》表达式求值①expr命令迎来对表达式进行求值,其操作符和运算符之前必须有空格隔开,在shell脚本中,数学表达式直接运算需要用两对圆括号括起来。例子:expr.shexpr 3 + 9expr 3 \* 2 #\表示转义sum=$((3+2))echo sum:$suma=3c=$(($a + 8))echo c:$c执行:chmod u+x expr.sh结果:sum:5c:11
②使用let内置命令可以完成对数值的运算例子:let.shlet a=11let a=a+5echo "11 + 5 = $a"
let "a << 3" #let "a = a <<3",16左移3位,就是128echo $a执行:chmod u+x ./let.sh结果:11 + 5 = 1516
6》shell脚本有两种方式执行:①filename.sh,②chmod u+x filename.sh 7》shell退出状态说明:下图展示了shell脚本的执行流程及退出状态的保存方法,由于shell解析器创建子进程执行shell脚本,因此shell进程是sell脚本的父进程,所以shell可以得到子进程的状态,shell脚本内命令同理。退出状态必须是十进制,范围必须是0~255,shell脚本执行成功返回0,报错范围非0。$?是一个shell的内置变量,代表着最后一次运行进程的退出状态码


6.Shell的输入和输出

1》shell输入指令是read函数,格式如下:read 变量1 [变量2]说明:利用read函数可以交互式地为变量赋值,也可以通过制表符或空格为多个变量赋值,使用read函数读入变量的三种情况说明如下:①如果变量的个数多余输入字符串的字符个数,则依次赋值,剩下的变量取空值②如果变量的个数等于输入字符串的字符个数,则一一对应赋值③如果变量的个数等于输入字符串的字符个数,则除依次赋值外,最后一个变量接纳剩下的所有字符串
2》echo是shell中实现文本输出和变量输出的函数,能输出提示信息,显示执行结果和报告执行状态等说明:①echo函数后面的各个参数之间用空格隔开,以换行符终止。如果数据之间必须保留多个空格,则要用双引号把它们整个给引起来。②echo函数中,定义一组转义字符,用于输出控制或打印无法显示的字符。在使用转义字符的时候,要加入"-e"选项转义字符:①\a:响铃报警②\b:后退一个字符位置③\c:它出现在参数的最后位置。在他之前的参数被显示后,光标不换行,新的输出信息接在本行后④\e:转义字符⑤\f:换页⑥\n:换行⑦\r:回车⑧\t:制表符⑨\v:垂直制表符⑩\\:反斜杠本身

7.Shell测试条件

提供两种条件测试,利用test命令和利用方括号形式,两者方式完全等价。定义格式如下:test -d $dir[-d $dir]1》条件测试分类:字符串测试、数值测试、逻辑测试、文件属性测试2》字符串测试:字符串测试的作用是测试字符串操作的返回值。注意:使用=、!=、<、>这些符号时,两边需加空格。


3》数值测试:主要用于两个数值之间大小的比较

4》逻辑测试:进行逻辑语句判断,也就是对“与”、“或”、“非”条件的判断。逻辑表达式中优先级顺序是:"()"运算符>"!"运算符>"-a"运算符>"-o"运算符。

5》文件属性测试:用于测试文件类型


8.Shell的流程控制结构

if、case、while、until、for、跳转(break、continue、exit)1》if语句:0表示真,非0表示为假。(注意:与其他编程语言相反 )语法形式如下:if 测试条件1then 命令或命令表elif 测试条件2then 命令或命令表else 命令或命令表fi
2》case语句:使用时注意以下事项①每个模式匹配后的处理语句,是以";;"两个分号进行结束②模式串表达式应该有唯一性,不要出现几个模式串表达式能够相互转换的情况,这样不利于语句调试③一个模式表达式可以包含多个模式串,但要用"!"隔开,"|"在这里是"或"的关系case 定义形式如下:case word inpattern 1) 命令表1;;pattern 2) 命令表2;;... *)缺省命令表;;esacC#switch-case语言形式如下:switch(p){case 1: break;default: break;}比较:word相当于传进来的变量p,pattern1常量相当于1
3》while语句执行过程:先测试条件语句是否为真,若为真,则执行循环体,执行完当前命令后,再进行条件测试。 说明:这里的条件测试语句既可以是test语句,也可以是运行命令的返回值,若返回值大于0则表示条件为真,否则条件为假while 定义形式如下:while 测试条件do 命令表done
4》until语句说明:until是while语句的一种变行。对于until语句中的条件测试语句,如果条件为假,则执行,否则不执行。与while条件值相反。until 定义形式如下:until 测试条件do 命令表done
5》for语句①统一语法定义形式:for 变量名 in 循环参数列表do 命令表done②数组作为循环参数,定义形式:for 变量名 in 数组表do 命令表done③正则表达式作为循环参数,定义形式:for 变量 in 正则表达式do 命令表done④位置参数作为循环参数,定义形式:for 变量 in $*do 命令表done
6》跳出语句①break语句:定义形式:n表示跳出几层循环,默认为1break
②continu语句:定义形式:n表示跳出几次循环,默认为1continue
③exit语句:定义形式:n是主动设定返回值,如果未显示设定,则该值默认取最后一次命令执行的状态作为返回值exit

9.shell数组

shell支持以为数组,但不限定数据的具体大小,数组的使用方式采用指定下标数组取值:${数组名[下标值]}数组赋值:数组名[下标值]=值数组一次性赋值:值与值之间要用空格隔开数组名={value value2 value3 ...}说明:数组中可以用*或@符号代替下标,这里*或@就是上下文说明的通配符

10.shell函数

通过调用一个命令名执行其中的命令集的过程叫函数,执行函数,不需要创建新进程,而是在当前shell进程中运行1》定义形式:function 函数名(){ 语句}注意:在这里,关键字function是可以不显示制定的。在使用函数时,应先定义再使用,函数调用时,只需指定函数名,不用加后面的()示例:show.shshow(){ echo $a $b echo $1 $2}a=111b=222c=333d=444echo "Function begin"show $c $decho "Function finished"结果:Function begin111 222333 444说明:函数中的$1 $2 对应show函数后面的$c $d了。
2》shell函数的参数和返回值①变量传递的两种方法:其一变量直接传递法,数量不限,如上文show.sh中变量a、b;其二位置参数法,数量最多9个,如上文show.sh中$1、$2②函数返回值:如果主动设定返回值return n ,那么n即为函数返回值,否则为最近一个命令的退出码

11.I/O重定向

表示重新定位数据的流向

1》常见I/O重定向方法cmd > file :把stdout重定向到file文件中cmd >> file:把stdout重定向到file文件中(追加)cmd 1> file:把stdout重定向到file文件中cmd > file 2>&1:把stdout和stderr一起重定向到file文件中cmd 2>> file:把stderr重定向到file文件中(追加) cmd >> file 2>&1:把stdout和stderr一起重定向到file文件中(追加)cmd <file>file2:cmd命令以file文件作为stdin,以file2文件作为stdoutcmd <file:以file文件作为stdincmd << delimiter:从stdin中读入,直至遇到delimiter分界符cmd <<- delimiter:从stdin中读入,直至遇到delimiter分解符,输入去掉行首tab键2》高级I/O重定向方法>&n:使用系统调用dup(2)赋值文件描述符,并把结果用作标准输出<&n:标准输入复制自文件描述符n<&-:关闭标准输入>&-:关闭标准输出n<&-:表示将文件描述符n输入关闭n>&-:表示将文件描述符n输出关闭cmd 2>file:运行一个命令并把错误输出定向到filecmd 2>&1:运行一个命令并把它的标准输出和输入合并(严格地说是通过复制文件描述符1来建立文件描述符2,但效果通常是合并了两个流)exec 1>outfilename:打开文件outfilename作为stdoutexec 2>errfilename:打开文件outfilename作为stderrexec 0<&-:关闭fd0exec 1<&-:关闭fd1exec 5<&-:关闭fd5

12.Shell内置命令





13.trap命令

常用于忽略某些信号或在脚本程序被信号中断时完成清理工作定义格式:trap 'command' signal-list说明:trap命令参数分两部分,前部分是接受指定信号时采取行动,后部分是要处理的信号名1》trap捕捉到信号有三种反应:①执行一段程序来处理这个信号②接受信号的默认操作③忽略这个信号2》trap对上面的三种方式提供了三种形式①设置信号的处理方式,使用第一种形式trap 'command' signal-listtrap "command" signal-list②恢复信号的默认操作,使用第二种形式trap signal-list③忽略信号,使用第三种形式trap "" signal-list说明:第一种trap命令,shell接收到signal-list清单中数值相同的信号时,将执行引号中的命令3》使用trap注意事项:①信号11(段违例)不能捕捉,因为shell本身需要捕捉改信号去进行内存的转存②捕捉到signal-list中指定信号并执行完相应命令之后,如果这些命令没有将shell程序终止的话,shell程序将继续执行收到信号时所执行命令的后面的命令,这样会很容易导致shell程序无法终止。③trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,将把command中的命令扫描一遍,此时若command用单引号引起来的话,那么shell不会对command中的变量和命名进行替换 能够被捕获的比较重要的信号列表

通常需要忽略的信号有四个,HUP、INT、QUIT、TSTP,也就是1、2、3、24,使用下面的语句可以忽略这些信号trap "" 1 2 3 24 或 trap "" HUP INT QUIT TSTP

14.date命令

显示和设置系统日期和时间,只有超级用户才能设置date,一般用户只能查看时间语法形式:查看时间格式需带+号date [选项] [+格式]1》date常见选项说明如下:①-d datestr,--date datestr 显示由datestr描述的日期②-s datestr,--set datestr 设置datestr描述的日期③-u,--universal 显示和设置通用时间


补充:EOF:在EOF处结束stdin输入注意:EOF必须顶行写,前面不能用制表符或空格,否则EOF不会被当作结束分隔符,只会继续当作stdin来输入,而在EOF前加<<-可以解决这一问题
参看书籍:深入浅出linux工具与编程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: