Shell脚本是Linux中很重要的一种“程序”。
- 什么shell脚本?
shell脚本是提前设计的可执行语句,用来完成特定任务的文件。
Shell脚本可分为交互式和非交互式
交互式:指脚本在运行时,需要一些人为的参与,比如,键盘输入数据,确认选项等。因为有人为的参与,所以运行时更加智能化,但是同时效率会降低
非交互式:指脚本运行时不需要人为干预,批量执行,效率高,但提高智能化难度大
2 shell脚本的规范格式
#!环境申明
# 注释文本
可执行代码
以上就是shell脚本的规范格式,也就是说你不管写什么脚本,一上来就可以把第一个环境申明写好。例如编程里最有名的一个程序‘Hello World’,这个不管学什么语言,貌似都是最开始写的一个程序。
[[email protected] 桌面]#vim /root/helloworld.sh
#!/bin/bash
echo "Hello World !!"
这样我们就写好了我们的第一个shell脚本。
Shell脚本中我们通常都是以.sh结尾,因为可以一看就知道是shell脚本但也不是非要以.sh结尾,可以在名称后面什么都不加
但shell脚本不是也写好就可以运行,在linux中还是要涉及到读写执行权限的,一般shell脚本写完后,系统是默认为一个基本文件的,我们需要赋予它可执行权限后,才可以运行该脚本,所以:
[[email protected] 桌面]#chmod +x /root/helloworld.sh
[[email protected] 桌面]#/root/helloworld.sh
Hello World !!
这样一个完整的可运行的脚本就写好了
3 shell脚本的基本创建过程
①明确任务需求:先做什么,后做什么
②编写代码文件:每个步骤的实现,然后转换成命令行的形式保存在脚本中
③测试并完善:根据运行结果排除错误,再进行代码优化,用户友好处理
4 简单脚本技巧
管道传递
使用 | 管道操作
– 将前一条命令的标准输出交给后一条命令处理
例如:
#!/bin/bash
useradd student
echo 123 | passwd --stdin student
这个脚本是自动创建用户student,并设置好密码为123.此处管道的作用就是将123交给passwd,用来设置为密码
重定向输出
>:只收集前面命令的正确输出
2>:只收集前面命令的错误输出
&>:收集前面命令的错误与正确输出
例如:
[[email protected] 桌面]#cat /opt/1.txt /etc/ > /opt/2.txt
cat: /etc/: 是一个目录
[[email protected] 桌面]#cat /opt/2.txt
123
[[email protected] 桌面]#cat /opt/1.txt /etc/ 2> /opt/2.txt
123
[[email protected] 桌面]#cat /opt/2.txt
cat: /etc/: 是一个目录
[[email protected] 桌面]#cat /opt/1.txt /etc/ &> /opt/2.txt
[[email protected] 桌面]#cat /opt/2.txt
123
cat: /etc/: 是一个目录
变量
在实际的编写脚本过程中,往往会涉及到许多数据,但这些数据都是同一类型,比如,一个班的考试成绩,许许多多的用户名等等,这些数据要是每个都为其写个脚本是繁琐的,而且是重复性操作,这是就需要一种“容器“,可以存放这些数据,并且随着数据的变化,其内容也跟着变化
什么是变量?
变量简单来说就是以不变的名称存放可能变化的值
基本形式:变量名=变量值
作用:方便以固定的名称重复使用某个值,提高对任务需求,运行环境变换的适应能力
定义变量时需要的注意的问题:
– 若指定的变量名已存在,相当于为此变量重新赋值
– 等号两边不要有空格
– 变量名由字母/数字/下划线组成,区分大小写
– 变量名不能以数字开头,不要使用关键字和特殊字符
查看和引用变量
– 引用变量值:$变量名
– 查看变量值:echo $变量名、echo${变量名}
变量的分类(运维角度):
环境变量:用来设置用户/系统环境
位置变量:在执行脚本时提供的命令行参数(非交互式传值)
预定义变量:用来保存脚本程序的执行信息,系统内置,我直接调用,无法更改
自定义变量:用户自主设置,随意更改、使用
这里先介绍位置变量与预定义变量
位置变量:
首先我们要知道位置变量到底指的是什么?
在linux中,变量是不能用纯数字来命名的,原因是数字都被用来定义位置变量了。
比如,我编写了一个/root/ps.sh的脚本内容如下:
#!/bin/bash
echo $1
echo $2
echo $3
运行结果如下:
[[email protected] 桌面]#/root/ps.sh 1 2 3
1
2
3
可以看出,我在脚本后面输入了三个数:1,2,3
输出结果是1,2,3
所以位置变量指的是在脚本后每个位置都是一个变量,第一个位置是变量1,第二位置是变量2,以此类推。
注:每个位置间是用空格区分的,不然再长的字符都是一个位置
所以上述的脚本是在屏幕上显示出位置变量1,2,3的内容
预定义变量:
$# 已加载的位置变量的个数
$* 所有位置变量的值
$? 程序退出后的状态值,0表示正常,其他值异常
例如,下面的脚本:
#!/bin/bash
echo $1
echo $2
echo $3
echo $#
echo $*
运行结果如下:
[[email protected] 桌面]#/root/ps.sh 1 2 3
1
2
3
3
1 2 3
可以看出,变量$#的作用是统计已使用的位置变量的个数,而$*的作用是将所有已使用的位置变量内容输出到屏幕上
变量$?作用比较特殊,如果一个程序正常输出结果,没有报错,系统会用“0”值对应这个结果,表明程序无异常,如果程序报错或出了其他状况,就会用其他非零值来表示这个结果。而储存这些值的就是变量$?。平时我们是看不见这个变量的,我们可以用echo $?的形式将这个值显示出来。
例如:
[[email protected] 桌面]#cat /mnt
cat: /mnt: 是一个目录
[[email protected] 桌面]#echo $?
1
Cat命令是用来查看文件的内容的,用来查看目录时是会报错的,这时,用echo $?就可以看到此时变量$?的值为1。这个变量是保存最后一个程序的输出状态,前面程序运行所产生的值会被覆盖。
在写脚本时,经常会涉及到关于比较与判断的选项,这里介绍关于这些的一些命令选项:
检查文件状态
-e:文档存在为真
-d:文档存在且为目录为真
-f:文档存在且为文件为真
-r:文档存在且有读取权限为真
-w:文档存在且有写入权限为真
-x:文档存在且有执行权限为真
比较整数大小(带e都有等于二字,g代表大于,l代表小于)
-gt:大于------------------>>greater than;
-ge:大于等于------------->>greater than or equal to
-eq:等于---------------->>equal;
-ne:不等于--------------->>not equal
-lt:小于--------------------->>less than
-le:小于等于-------------->>less than or equal to
字符串比对
== :相等
!=:不相等
Shell脚本的编写涉及到很多知识,这里先介绍一些基础简单的知识与运用。