Shell编程

1.Shell 环境变量:

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

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

1》PWD:当前用户的工作目录
2》HOME:用户主目录的路径全名
3》LOG NANME:用户的登录名
4》SHELL:当前所使用的SHELL
5》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》[](内置表达式):计算算术表达式的值,相当于test
31》{}:用来封装函数体
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=$user
var2=$var1
③参数置换方式赋值
${变量:-字符串}      #如果变量被设定并非空,则返回变量的值,否则是字符串的值
${变量:+字符串}     #如果变量被设定并非空,则返回字符串值,否则是变量的值(即空值)
${变量:=字符串}     #如果变量被设定并非空,则返回变量的值,否则是字符串的值,同时变量被设定成字符串
${变量:?字符串}      #如果变量被设定并非空,则返回变量的值,否则返回报错

4》位置变量
Shell脚本可以向脚本命令行传递参数。在shell中,$0表示执行的程序名,$1~$9是传递的命令行参数,shell脚本最多能传递9个参数,$1~$9称为shell内置的位置变量。shift会让位置参数左移一位,即$2 变$1、$3变$2。
例子:arg.sh,测试位置变量变化效果
#!/bin/sh
echo NO.0 $0
echo NO.1 $1
ehco NO.2 $2
ehco NO.3 $3

shift
echo shifting
echo NO.0 $0
echo NO.1 $1
ehco NO.2 $2
ehco NO.3 $3
执行:chmod u+x ./arg.sh arg1 arg2 arg3 arg4
结果:
echo NO.0 ./arg.sh
echo NO.1 arg1
ehco NO.2 arg2
ehco NO.3 arg3
shifting
echo NO.0 ./arg.sh
echo NO.1 arg2
ehco NO.2 arg3
ehco NO.3 arg4

5》表达式求值
①expr命令迎来对表达式进行求值,其操作符和运算符之前必须有空格隔开,在shell脚本中,数学表达式直接运算需要用两对圆括号括起来。
例子:expr.sh
expr 3 + 9
expr 3 \* 2     #\表示转义
sum=$((3+2))
echo sum:$sum
a=3
c=$(($a + 8))
echo c:$c
执行:chmod u+x expr.sh
结果:
sum:5
c:11

②使用let内置命令可以完成对数值的运算
例子:let.sh
let a=11
let a=a+5
echo "11 + 5 = $a"

let "a << 3"               #let "a = a <<3",16左移3位,就是128
echo $a
执行:chmod u+x ./let.sh
结果:
11 + 5 = 15
16

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 测试条件1
then 命令或命令表
elif 测试条件2
then 命令或命令表
else 命令或命令表
fi

2》case语句:使用时注意以下事项
①每个模式匹配后的处理语句,是以";;"两个分号进行结束
②模式串表达式应该有唯一性,不要出现几个模式串表达式能够相互转换的情况,这样不利于语句调试
③一个模式表达式可以包含多个模式串,但要用"!"隔开,"|"在这里是"或"的关系
case 定义形式如下:
case word in
pattern 1) 命令表1;;
pattern 2) 命令表2;;
...
     *)缺省命令表;;
esac
C#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表示跳出几层循环,默认为1
break [n]
②continu语句:
定义形式:n表示跳出几次循环,默认为1
continue [n]
③exit语句:
定义形式:n是主动设定返回值,如果未显示设定,则该值默认取最后一次命令执行的状态作为返回值
exit [n]

9.shell数组

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

10.shell函数

通过调用一个命令名执行其中的命令集的过程叫函数,执行函数,不需要创建新进程,而是在当前shell进程中运行
1》定义形式:
function 函数名()
{
     语句
}
注意:在这里,关键字function是可以不显示制定的。在使用函数时,应先定义再使用,函数调用时,只需指定函数名,不用加后面的()
示例:show.sh
show()
{
     echo $a $b
     echo $1 $2
}
a=111
b=222
c=333
d=444
echo "Function begin"
show $c $d
echo "Function finished"
结果:
Function begin
111 222
333 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文件作为stdout
cmd <file:以file文件作为stdin
cmd << delimiter:从stdin中读入,直至遇到delimiter分界符
cmd <<- delimiter:从stdin中读入,直至遇到delimiter分解符,输入去掉行首tab键
2》高级I/O重定向方法
>&n:使用系统调用dup(2)赋值文件描述符,并把结果用作标准输出
<&n:标准输入复制自文件描述符n
<&-:关闭标准输入
>&-:关闭标准输出
n<&-:表示将文件描述符n输入关闭
n>&-:表示将文件描述符n输出关闭
cmd 2>file:运行一个命令并把错误输出定向到file
cmd 2>&1:运行一个命令并把它的标准输出和输入合并(严格地说是通过复制文件描述符1来建立文件描述符2,但效果通常是合并了两个流)
exec 1>outfilename:打开文件outfilename作为stdout
exec 2>errfilename:打开文件outfilename作为stderr
exec 0<&-:关闭fd0
exec 1<&-:关闭fd1
exec 5<&-:关闭fd5

12.Shell内置命令


13.trap命令

常用于忽略某些信号或在脚本程序被信号中断时完成清理工作
定义格式:
trap 'command' signal-list
说明:trap命令参数分两部分,前部分是接受指定信号时采取行动,后部分是要处理的信号名
1》trap捕捉到信号有三种反应:
①执行一段程序来处理这个信号
②接受信号的默认操作
③忽略这个信号
2》trap对上面的三种方式提供了三种形式
①设置信号的处理方式,使用第一种形式
trap 'command' signal-list
trap "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工具与编程
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Potter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值