Linux之shell script学习小结

shell script是利用shell的功能所写的一个“程序”,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的。

一,第一个shell script

(1)第一行#!/bin/bash声明这个script使用的shell名称:因为我们使用的是bash,所以必须以“#!/bin/bash”来声明这个文件内的语法使用bash的语法。那么当这个程序被执行时,它就能加载bash相关环境配置文件,并且执行bash来使我们下面的命令能够执行。
(2)程序内容说明:除了第一行的#!是用来声明shell的之外,其他的#都是“批注”用途。一般来说,建议养成说明该script的内容与功能、版本信息、作者与联络方式、建立日期等习惯。

1.交互式脚本:变量内容由用户决定

输出:

2.数值运算:简单的加减乘除

我们可以使用declare来定义变量的类型,此外,我们也可以利用$((计算式))来进行数值运算。可惜的是,bash shell只支持整数是数据哦!

输出:

(1)在数值运算上,我们可以使用“declare -i total=$firstnu*$secnu”,也可以使用上面的方式来进行。即:var=$((运算内容))

(2)上述倒数第二行=号两边不能有空格,否则将运行如下错误:

二,使用判断式

前面我们提过$?(成功返回0,失败返回非0)这个变量代表的意义,并且介绍过&&和||,那么如果我们想要判断一个目录是否存在,可以使用”test”命令。

test -e /dmtsai && echo “exists” || echo “Not exists”    #检查/dmtsai是否存在

1.test的用法如下:(也可man test查看帮助手册)

(1)关于某个文件名的“文件类型”的判断,如test -e filename表示是否存在
-e:该文件名是否存在(常用)
-f:该文件名是否存在且为文件(常用)
-d:该文件名是否存在且为目录(常用)
-b:该文件名是否存在且为一个block device设备
-c:该文件名是否存在且为一个character device设备
-S:该文件名是否存在且为一个Socket文件
-p:该文件名是否存在且为一个FIFO(pipe)文件
-L:该文件名是否存在且为一个连接文件

(2)关于文件的权限检测,如test -r filename 表示可读否
-r:检测该文件名是否存在且具有“可读”的权限
-w:检测该文件名是否存在且具有“可写”的权限
-x:检测该文件名是否存在且具有“可执行”的权限
-u:检测该文件名是否存在且具有“SUID”的属性
-g:检测该文件名是否存在且具有“SGID”的属性
-k:检测该文件名是否存在且具有“Sticky bit”的属性
-s:检测该文件名是否存在且为“非空白文件”

(3)两个文件之间的比较,如:test file1 -nt file2
-nt:(newer than)判断file1是否比file2新
-ot:(older than)判断file1是否比file2旧
-et:判断file1与file2是否为同一个文件,可用在判断hard link的判定上。主要意义在于判定两个文件是否均指向同一个inode

(4)关于两个整数之间的判定,例如test n1 -eq n2
-eq:两数值相等
-ne:两数值不等,可用于判断上一个脚本执行是否正确:if[ $? -ne 0 ] …
-gt:n1大于n2(greater than)
-lt:n1小于n2(less than)
-ge:n1大于等于n2(greater than or equal)
-le:n1小于等于n2(less than or equal)

2.利用判断符号[ ]

例如判断$HOME是否为空,可以这样做:

注意:在bash的语法当中使用中括号作为shell的判断式时,必须要注意中括号的两端需要有空格符来分隔!

使用[ ]判断符号需要注意:

(1)在中括号内的每个组件都需要有空格键来分隔(包括==号,如下面的示例)
(2)在中括号内的变量,最好都以双引号括起来
(3)在中括号内的常量,最好都以单或双引号括起来

3.shell script的默认变量($0, $1)

script针对参数已经有设置好一些变量的名称了,对应对下:

4.条件判断式

(1)if…then

举个例子:

netstat命令可以查询到目前主机打开的网络服务端口(service ports),我们可以利用“netstat -tuln”来取得目前主机有启动的服务。(其中t表示tcp,u表示udp,l表示linstening, n表示numeric即将端口用数字表示,如http–>80)

输出:

(2)case…esac

例子:

输出:

(3)利用function功能

简单地说,函数可以在shell script当中做出一个类似自定义执行命令的东西,最大的功能是,可以简单我们很多的程序代码。function的语法如下:

将上面的例子改写如下:

输出:

5.循环(loop)

(1)不定循环:while do done, until do done

假设我们要让用户输入yes或YES才结束程序的执行,否则就一直进行告知用户输入字符串:

如果使用until,则如下:

再如,计算1+2+3+…+100

输出:

(2)固定循环:for…do…done

相对于while,until的循环方式是必须要“符合某个条件”的状态,for这种语法则是“已经知道要进行几次循环”的状态,它的语法如下:

例一:有三种动物,每一行都输出“There are dogs…”之类的字样

注意,dog->dogs,这里我们需要在变量的后面加上s,该语句若这样写是显然不对的:echo “There are $animals…”
所以这里使用了{ }的写法

例二:由于系统上面的各种账号都写在/etc/passwd内的第一个字段,所以可以通过管道命令cut找出单纯的账号名称后,以id及finger分别检查用户的标识符与特殊参数

输出:

for…do…done的数值处理,除了上述方法之外,for循环还有另外一种写法:

例子如下:

输出:

其中几点注意:
1)nu前面需要有一个空格;
2)for循环有两层括号;
3)数值计算,for循环体也要有两层括号。

参考:
Linux私房菜
man手册

发表评论

电子邮件地址不会被公开。 必填项已用*标注