shell脚本的基础知识
编程语言分类
编译型语言
解释型语言
shell脚本语言是解释型语言
shell脚本的本质
shell命令的有续集合
shell编程的基本过程
建立shell文件.sh
包含任意多行操作系统命令或shell命令的文本文件
赋予shell文件执行权限
用chmod命令修改权限
执行shell文件 ./文件名.sh bash 文件名
直接在命令行上调用shell程序
![](https://img-blog.csdnimg.cn/img_convert/4295452064c8d0f64625f8c24315e1eb.png)
shell变量
shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解释为一串字符
variable=value
![](https://img-blog.csdnimg.cn/img_convert/4a0f0637b4529db253af56e1b573a204.png)
![](https://img-blog.csdnimg.cn/img_convert/fbaddc96dbf52d4e9e5426969e5ce987.png)
Bourne Shell有如下四种变量:
用户自定义变量
使用unset命令 取消自定义变量
![](https://img-blog.csdnimg.cn/img_convert/e17cab5cb8dcf18db280afcc2536310a.png)
位置变量即命令行参数
$0与键入的命令行一样,包含脚本文件名
$1,$2,....$9分别包含第一个到第九个命令行参数
$#包含命令行参数的个数
$@包含所有命令行参数"$1,$2,.....$9"
$?包含前一个命令的退出状态
$*包含所有命令行参数:"$1,$2,....$9"
$$包含正在执行进程的ID号
举例如图:
![](https://img-blog.csdnimg.cn/img_convert/cc53d4b5131b3aa0b23518edacb1cc18.png)
![](https://img-blog.csdnimg.cn/img_convert/6a020c67caf7be45c5444d58c9837e32.png)
0代表正常退出
预定义变量
环境变量
shell常用环境变量
HOME:/etc/passwd文件中列出的用户主目录
IFS:Internal Field Separator,默认为空格,tab以及换行符
PATH:shell搜索路径
PS1,PS2:默认提示符($)以及换行提示符(>)
TERM:终端类型,常用的有vt100,ansi,vt200,xterm等
shell脚本功能语句
说明性语句
shell程序由零或多条shell语句构成。shell语句包括三类:
说明性语句
以#号开始到改行结束,不被解释执行(注释语句)
功能性语句
任意的shell命令、用户程序或其他shell程序
结构性语句
条件测试语句
多路分支语句
循环语句
循环控制语句等
常用功能性语句
read从标准输入读入一行,并赋值给后面的变量,其语法为:
read var
把读入的数据全部赋给var
read var1 var2 var3
把读入行中的第一个单词(word)赋给var1,第二个单词赋给var2,。。。。把其余所有的词赋给最后一个变量
如果执行redad语句时标准输入无数据,则程序在此停留等候到数据的到来或者被终止运行
eg:
![](https://img-blog.csdnimg.cn/img_convert/997dc1cf484be0afc8a27c3bc3933e85.png)
数据结果:
![](https://img-blog.csdnimg.cn/img_convert/a89b2c584f82791585734a86af71e43a.png)
expr命令
算术运算命令expr主要用于进行简单的整数运算,包括+-*/%等操作
eg:
$expr 12 + 5 \* 3
$expr 3 - 8/2
$num=9 $sum=`expr $num \* 6` echo $sum
![](https://img-blog.csdnimg.cn/img_convert/4e263caddbf035811d49c06a6cc3cc8e.png)
![](https://img-blog.csdnimg.cn/img_convert/7df2519d8b656f40c5bb5729d527a05c.png)
测试语句
test语句可测试三种对象
字符串
整数
文件属性
每种测试对象都有若干测试操作符
eg: test "$answer" = "yes" 变量answer的值是否为字符串year
eg: test $num -eq 18 变量num的值是否是18
eg: test -d tmp 测试tmp是否为一个目录名
字符串测试
![](https://img-blog.csdnimg.cn/img_convert/8e403075411967963ec86f690ca34a84.png)
![](https://img-blog.csdnimg.cn/img_convert/2a13fd343b1b611f0d60a2e7f7c25602.png)
![](https://img-blog.csdnimg.cn/img_convert/b662ae32fd0d83debc11efa995ad0281.png)
整数测试
a -eq b 测试a与b是否相等
a -ne b 测试a与b是否不想等
a -gt b 测试a是否大于b
a -ge b 测试a是否大于等于b
a -lt b 测试a是否小于b
a -le b 测试a是否小于等于b
![](https://img-blog.csdnimg.cn/img_convert/3a1353c87d6e13c93e3505f436cbdfb8.png)
![](https://img-blog.csdnimg.cn/img_convert/5f8c1b88e8eabe459df2abbce6ee0da0.png)
文件测试
-d name 测试name是否是一个文件目录
-e name 测试一个文件是否存在
-f name 测试name是否为普通文件
-L name 测试name是否为符号连接
-r name 测试name文件是否存在且为可读
-w name 测试name文件是否存在且为可写
-x name 测试name 文件是否存在且为可执行
-s name 测试name文件是否存在且长度不为0
f1 -nt f2 测试文件f1 是否比文件f2更新
f1 -ot f2 测试文件f1 是否比文件f2更旧
![](https://img-blog.csdnimg.cn/img_convert/73e70af2ae71edffb90d6e51302e1a2b.png)
![](https://img-blog.csdnimg.cn/img_convert/9d3d1e4a71029397907139d5901bbbb8.png)
4.shell脚本分支语句
条件语句
if...then..fi
语法结构:
if 表达式
then
命令表
fi
如果表达式为真,则执行命令表中的命令,否则退出if语句
if和fi是条件语句的语句括号,必须成对使用
命令表中的命令可以是一条,也可以是若干条
![](https://img-blog.csdnimg.cn/img_convert/f585614c2b69f814842f2e550889d3c0.png)
![](https://img-blog.csdnimg.cn/img_convert/f31ca59a4ec9e908508e5cd270d27076.png)
![](https://img-blog.csdnimg.cn/img_convert/7befe8c14a9de1802982dcbbc2728617.png)
![](https://img-blog.csdnimg.cn/img_convert/beb8df452dec8e8adc0acee17ecd8d55.png)
![](https://img-blog.csdnimg.cn/img_convert/1d047f7ebab1f824a8e15966c6819e89.png)
多路分支语句
case .....esac
语法为:
case 字符串变量 in
模式1)
命令表1
;;
模式2|模式3)
命令表2
;;
.....
模式n)
命令表n
;;
case语句只能检测字符串变量
各模式中可用文件名元字符,以右括号结束
一次可以匹配多个模式,用"|"分开
命令表以单独的双分号行结束,退出case语句
模式n常写为字符*表示其他所有模式
最后一个双分号行可以省略
![](https://img-blog.csdnimg.cn/img_convert/fb19b2219fd7a8bb47a695d0a0bcb4af.png)
![](https://img-blog.csdnimg.cn/img_convert/9639580852ac892033970599b0c14368.png)
循环语句
for用法:
for 变量名 in 单词表
do
命令表
done
![](https://img-blog.csdnimg.cn/img_convert/47d01fdee3037feee1f60c2d0d17cbae.png)
![](https://img-blog.csdnimg.cn/img_convert/6aee97416b2c6f267bf11792ab337a0a.png)
while用法
语法结构:
while m命令或表达式
do
命令表
done
while语句的退出状态为命令表中被执行的最后一条命令的退出状态
![](https://img-blog.csdnimg.cn/img_convert/9c510470080d331b704de0029db43941.png)
![](https://img-blog.csdnimg.cn/img_convert/d36551c246f574566d16ef9403c8d23c.png)
循环控制语句break/continue
![](https://img-blog.csdnimg.cn/img_convert/314e1c7e242ce1e6d61e37bc4020e696.png)
![](https://img-blog.csdnimg.cn/img_convert/0e58cbcd1cf024b8901b9fbe92d5c7c2.png)
5.shell函数
shell函数调用
函数变量作用域,默认全局,local是局部
![](https://img-blog.csdnimg.cn/img_convert/775a3061365de97e5237857874f74bf6.png)
![](https://img-blog.csdnimg.cn/img_convert/aae65c69bb3a59fb6e2efb1db19fecab.png)