1、shell脚本简介
shell脚本是与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或管理用的,但是它比Windows下的批处理更强大,比其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。
shell和shell脚本的区别?
确切一点来说,shell就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统,它为用户提供了一个向linux发送请求以便运行程序的接口系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。shell本身是一个用C语言编写的程序,它是用户使用linux的桥梁。
shell既是一种命令语言,又是一种程序设计语言(即shell脚本)。作为命令语言,它互动式的解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支,它虽然不是linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的执行。
总结:
shell:
(1)命令解释器:类型与命令行中输入ls、cd等命令,linux系统给出相应的操作
(2)脚本语言:类型于C语言,有自己的数据结构、语法结构、循环、条件、判断等。
由图可以看出,最底下是计算机硬件,然后硬件被系统核心包住,在系统核心外层的就是shell,然后shell外层的就是我们最容易理解的应用程序,我们平时接触最多的就是应用程序了。看图可知:shell其实是一个命令解释器,它的作用是解释用户输入的命令和程序,命令和程序可以理解成我们图中的应用程序,我们linux系统中的那些命令其实也都是一个个的小程序,只不过完成的是系统的应用功能。我们在系统的终端中输入一条命令,可以立马看到一条或者几条系统回复我们的信息,其实就是shell在帮我们回复,所以shell可以称之为命令解释器。这种从键盘一输入命令,就可以立马得到相应的回复信息,叫作交互的方式,相当于我们在和电脑交流。Shell存在于系统的最外层,所以算作操作系统的外壳,它之外的应用程序就不能算作操作系统了。我们从输入系统的账户密码开始,到登录系统以后的所有操作都是shell在帮我们解释执行的。
了解了shell之后,我们再来了解下shell脚本。如果我们的命令或者应用程序不在命令行直接执行,而是通过一个程序文件来执行时,这个程序就被称之为shell脚本。Shell脚本里面通常内置了多条命令,有的还包含控制语句,比如if和else的条件控制语句,for和select的循环控制语句等。这些内置在一个shell脚本中的命令通常是一次性执行完成,不会不停的返回信息给用户,这种通过文件执行脚本的方式称之为非交互方式。Shell脚本类似于windows下的批处理,但是它比批处理要强大一些,现在windows下有一个叫做power shell的功能可以和linux下的shell功能媲美。
我们可以在文本中输入一系列的命令、控制语句和变量,这一切有机的结合起来就形成了功能强大的shell脚本。
2、shell脚本的基本使用
shell脚本是一门解释性的语言,代码不需要进行编译
使用:新建一个文件,文件后缀是.sh
文件的第一行内容必须是:#!/bin/bash
#!/bin/bash的含义就是指定shell类型(即指定用什么来解析脚本)
#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。
/bin/bash:脚本类型。
脚本里面可以写什么?
(1)所有的命令行操作
(2)自己的语法结构
脚本的执行:
先添加可执行权限(chmod +x yyy.sh),然后直接去运行就可以了,不需要再进行编译。
3、linux下shell分类
shell分类可参考:https://www.cnblogs.com/leilong/p/9206487.html
4、bash的介绍
bash是一个命令处理器,通常运行于文本串口中,并能执行用户直接输入的命令,bash还能从文件中读取命令,这样的文件称为脚本。
5、输出命令
echo:默认会输出换行,默认不会输出转义字符(诸如:\t\n\r\a\b\f…)
若想输出转义字符,需要使用参数-e。
echo改变输出文字颜色和背景色
固定格式:
\033[显示方式;前景色;背景色m
其中\033是ESC健的八进制,\033[即告诉终端后面是设置颜色的参数,显示方式,前景色,背景色均是数字,m是一个结尾
显示方式 |
意义 |
|
0 |
终端默认设置 |
|
1 |
高亮显示 |
|
4 |
使用下划线 |
|
5 |
闪烁 |
|
7 |
反白显示 |
|
8 |
不可见 |
|
前景色 |
背景色 |
颜色 |
30 |
40 |
黑色 |
31 |
41 |
红色 |
32 |
42 |
绿色 |
33 |
43 |
黃色 |
34 |
44 |
蓝色 |
35 |
45 |
紫红色 |
36 |
46 |
青蓝色 |
37 |
47 |
白色 |
想要显示一个带下划线,红色文字,绿色背景的hello:
\033[4;31;42mhello\033[0m
将hello显示成带下划线,红色文字,绿色背景,在显示完成只会,恢复系统默认设置
echo里边引号的作用
'':单引号
能够去除特殊字符的含义
"":双引号
保留特殊字符的含义
``:小飘号
当单引号或者双引号引起来的是一个命令的时候,默认命令是不会执行的,但是如果使用``(倒引号,小飘号)引起来,命令就会去执行。
printf:和c语言一样,这里边不需要括号
6、注释
单行注释:#
注释一段:
:<<标识
注释的代码
标识
7、shell脚本里面的变量
变量没有类型之分,直接定义即可,引用加$
变量分类:
(1)普通变量--》文本字符串,和makefile里边的变量类似
没有类型的区分,全部当作字符串处理
变量的定义
格式
变量名=值
等号两边不要有空格
取消定义
unset 变量名
(2)特殊变量
$@
$* 所有的命令行参数,各参数之间空格隔开
$0:命令本身
$1 $2 $3 $4.....
依次代表每一个命令行参数
$#:命令行参数个数
$?:保存上一次执行的结果 成功是0 失败是1
$$:显示当前进程号
(3)环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。
windows
linux下边也一样
env查看所有的环境变量
查看某一个:echo
echo $PATH
env显示用户的环境变量;
set 显示当前shell的定义的私有变量,包括用户的环境变量,按变量名称排序;
export 显示当前导出成用户变量的shell变量,并显示变量的属性(是否只读),按变量名称排序;
declare 同set 一样,显示当前shell的定义的变量,包括用户的环境变量
设置环境变量
(1)在命令行修改--》重启失效
(2)修改配置文件
修改用户的配置文件--》只对用户可见
/root/.bashrc(推荐)
修改系统配置文件--》对所有用户可见
/etc/inittab
/etc/profile
/etc/rcs
export是查看和修改环境变量
export PATH=$PATH:/新的值
命令行修改,重启失效
修改配置文件,重启之后永久有效
PATH:存放的是所有可执行文件的路径
在执行命令的时候,其实就是在这些路径下边区查找,有就去执行,没有就报错。
变量的引用:${变量名}
输入
read num//输入num
类似scanf
readonly num=5 //定义只读变量num
定义的时候可以赋初值,之后不能修改
8、运算符和表达式
(1)算数运算符:
+:对两个变量做加法。
-:对两个变量做减法。
*:对两个变量做乘法。
/:对两个变量做除法。
**:对两个变量做幂运算。
%:取模运算,第一个变量除以第二个变量求余数。
+=:加等于,在自身基础上加第二个变量。
-=:减等于,在第一个变量的基础上减去第二个变量。
*=:乘等于,在第一个变量的基础上乘以第二个变量。
/=:除等于,在第一个变量的基础上除以第二个变量。
%=:取模赋值,第一个变量对第二个变量取模运算,再赋值给第一个变量。
(2)进行运算的几种方式:
注意事项:
用expr表示后面的表达式为一个数学运算。需要注意的是,`并不是一个单引号,而是“Tab”键上面的那个符号,表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2。
用let表示后面的表达式为一个数学运算。表达式中的变量前不必有$.如果表达式中包含了空格或其他特殊字符,则必须引起来。
例:let “I = I + 1” 或 let i=i+1
(3)文件操作运算符:
-e(exit):文件是否存在
-d(dir):是否是目录
-f:是否是普通文件
-L(link):是否是链接文件
-r:是否具备可读权限
-w:是否具备可写权限
-x:是否具备可执行权限
文件1 -nt(new than) 文件2:判断文件1是否比文件2新
文件1 -ot(old than) 文件2:判断文件1是否比文件2旧
(4)字符操作运算符:
-z(zero) 字符串:字符串长度是0,是真
-n(name) 字符串:字符串长度不是0,是真
字符串1 = 字符串2 :相等是真
字符串1 != 字符串2 :不相等是真
(5)逻辑运算符:
&& || !
-a(and)
-o(or)
-!
(6)比较运算符:
> >= < <= == !=
-gt(greater than)
-ge(greater equal)
-lt(less than)
-le(less equal)
-eq(equal)
-ne(not equal)
$?:存储上一条运算的结果:
真是0,假是1
(7)表达式判断:
test 表达式
[ 表达式 ]:注意,中括号和表达式之间要加空格
[[表达式]]:
[]和[[]]的区别:
[[]] 增强方括号用法, 常用于字符串的比较. 主要用于条件测试, 双括号中的表达式可以使用&&, ||, ==, !=等C语言语法.这些操作仅限于字符串比较
比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ].
[]相当于test
在中括号中,判断变量的值,加不加双引号的问题?
-z 判断变量的值,是否为空;zero=0
-变量的值,为空,返回0,为true
-变量的值,非空,返回1,为false
-n 判断变量的值,是否为空 name=名字
-变量的值,为空,返回1,为false
-变量的值,非空,返回0,为true
pid=“123”
[ -z “$pid” ]单对中括号变量必须要加双引号
[[ -z $pid ]]双对括号,变量不用加双引号
[ -n “$pid” ]单对中括号变量必须要加双引号
[[ -z $pid ]]双对括号,变量不用加双引号
9、流程控制
(1)判断
if...else...then
if [条件1]
then
命令1
elif [条件2]
then
命令2
....
else
命令n
fi
注意:
if后边要加空格
没有大括号
多了then
elif的写法
if语句结束的时候有fi
(2)case
case $变量 in
"1")
命令1
;;
“2”)
命令2
;;
esac
注意:
没有switch
在case后边有in
常量的描述需要双引号和右半个圆括号
执行的语句结尾没有break
语句的下一行有两个分号
结束的时候有esac结尾
(3)循环
for
形式1:
for x in 列表
do
命令
done
注意:
for后边没有小括号
没有大括号
循环体在do 和done之间
形式2:
for((i=0;i<5;i++))
do
语句
done
(4)循环条件的表达:seq命令
seq用于产生从某个数到另一个数之间的所有整数
seq 1 10
产生1到10 之间的整数,默认的增量是1
seq 1 3 10
产生1到10 之间的整数,增量是3
seq 10 -2 1
产生10到1 之间的整数,增量是-2
$(seq 1 10)
for x in $(seq 1 10)
do
命令
done
(5)while
形式1:
while [循环条件]
do
命令
done
形式2:
while ((循环条件 ))
do
命令
done
(6)until
形式1:
until ((结束条件))
do
命令
done
形式2
until [ 结束条件 ]
do
命令
done
(7)控制
exit:退出
return
break:跳出循环
continue:结束本次循环,开始下一次循环
(8)数组和函数
数组定义
定义 1: a=(1 2 3 4 5)下标从 0 开始 各个数据之间用空格隔开
定义 2: a[0]=1;a[1]=2;a[2]=3
定义 3: a=([1]=1 [2]=2)
引用
${a[1]}
取值: ${a[0]}
${a[@]} //取数组中所有的值
${#a[@]} //取数组的长度
${a[@]:2} //截取下标为2以后的所有元素
${a[@]:2:2} //截取下标为2以后的2个元素
函数:无参数,无返回值--》封装代码
需要关键字function
10、脚本的结束
(1)exit
(2)return
exit与return的区别
(1)作用不同。exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程。而return是返回函数值并退出函数;
(2)语义层级不同。return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束;
(3)使用方法不用。return一般用在函数方法体内,exit可以出现在Shell脚本中的任意位置。