linux之shell脚本

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语言,有自己的数据结构、语法结构、循环、条件、判断等。

linux之shell脚本

    由图可以看出,最底下是计算机硬件,然后硬件被系统核心包住,在系统核心外层的就是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显示成带下划线,红色文字,绿色背景,在显示完成只会,恢复系统默认设置

linux之shell脚本

echo里边引号的作用

'':单引号

能够去除特殊字符的含义

"":双引号

保留特殊字符的含义

linux之shell脚本

``:小飘号

当单引号或者双引号引起来的是一个命令的时候,默认命令是不会执行的,但是如果使用``(倒引号,小飘号)引起来,命令就会去执行。

linux之shell脚本

linux之shell脚本

printf:和c语言一样,这里边不需要括号

6、注释

    单行注释:#

注释一段:

:<<标识

注释的代码

标识

7、shell脚本里面的变量

变量没有类型之分,直接定义即可,引用加$

变量分类:

(1)普通变量--》文本字符串,和makefile里边的变量类似

没有类型的区分,全部当作字符串处理

变量的定义

格式

变量名=值

等号两边不要有空格

取消定义

unset  变量名

linux之shell脚本

linux之shell脚本

(2)特殊变量

[email protected]

$*  所有的命令行参数,各参数之间空格隔开

$0:命令本身

$1  $2 $3 $4.....

依次代表每一个命令行参数

$#:命令行参数个数

$?:保存上一次执行的结果  成功是0 失败是1

$$:显示当前进程号

(3)环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。

环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

windows

 linux之shell脚本

linux下边也一样

env查看所有的环境变量

 linux之shell脚本

查看某一个: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:存放的是所有可执行文件的路径

在执行命令的时候,其实就是在这些路径下边区查找,有就去执行,没有就报错。

变量的引用:${变量名}

linux之shell脚本

输入

read num//输入num

类似scanf

readonly num=5  //定义只读变量num

定义的时候可以赋初值,之后不能修改

8、运算符和表达式

(1)算数运算符:

+:对两个变量做加法。

 -:对两个变量做减法。

 *:对两个变量做乘法。

 /:对两个变量做除法。

**:对两个变量做幂运算。

%:取模运算,第一个变量除以第二个变量求余数。

+=:加等于,在自身基础上加第二个变量。

-=:减等于,在第一个变量的基础上减去第二个变量。

*=:乘等于,在第一个变量的基础上乘以第二个变量。

 /=:除等于,在第一个变量的基础上除以第二个变量。

%=:取模赋值,第一个变量对第二个变量取模运算,再赋值给第一个变量。

(2)进行运算的几种方式:

linux之shell脚本

注意事项:

用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脚本中的任意位置。