Linux之shell脚本编程基础(一)
一. shell脚本的简介
shell是一个命令解释器。他是一种功能强大的编程语言。一个shell程序,通常被称作为脚本,并有系统调用。事实上,shell脚本可以调用整个linux系统命令、软件包、工具。另外,shell的内部命令,如测试和循环控制结构,都使得shell脚本更加的强大和弹性。
二. 为什么要用shell脚本编程
简单的来说,脚本程序其实是存储在一个文件里的系统命令列表。因此我们可以把许多反复操作的命令组合成一个脚本,使用时调用这个脚本程序即可。另外,我们也可以很容易的修改或者定制一个脚本,来达到我们想要实现的控制命令。
三. 一个简单的例子说明脚本的基本格式
首先我们先建一个hi.sh文件,文件内容如下:
#!/bin/bash
#
echo “hi,how are you?”
1. 第一行的#!是说明该文件类型是一个shell脚本,也就是以.sh结尾的文件。其实在linux中的可执行程序中的前四个字节标识了一个文件的类型。
2. /bin/bash则表示该文件是一个bash程序,需要有/bin目录下的bash程序来执行,其实就是一个脚本解释器。
3. 第二行的#是bash程序的注释,即可以简单的标注一下每一段程序代码的含义,可以让我们的程序更加易懂。
4. 第三行的echo的功能是把引号里的字符串输出到标准输出中去。
由于他是一个文本文件,所有并没有执行权限,那么该如何把他变成一个可执行程序呢?
第一种方法:
使用chmod +x hi.sh 即赋予该文件执行权限,然后键入 ./hi.sh,改程序即可执行成功。
第二种方法
因为该文件本身就是一个bash程序,所有可以直接使用bash ./hi.sh即可执行成功
四. bash脚本中的一些常用知识介绍
4.1、关于输入、输出和错误输出
既然脚本的执行必须要有对应的shell程序来实现,然而程序的重要功能是:读入数据—>处理—>输出数据。所以在此简单的介绍一下linux下的输入、输出和错误输出。
在linux系统中,标准输入默认为键盘输入;标准输出则默认为屏幕输出;标准错误输出默认也是输出到屏幕。
在这里简单的介绍一下错误输出,它主要是为程序调试和系统维护目的而设置的,错误输出和标准输出分开,可以让一些高级的错误信息不干扰正常的输出信息,从而方便用户的使用。
在bash中标准输入表示为0,标准输出表示为1,错误输出表示为2
输入、输出及标准错误输出主要用于I/O的重定向,即改变默认的数据流向。下面简单介绍几个用法:
> 覆盖输出重定向
例子:ls /etc > /tmp/et 表示将ls命令的结果输出重定向到/tmp/et下,如果et文件中有内容则被覆盖
>> 追加输出重定向
例子:ls -l /etc >> /tmp/et 表示将ls命令的结果输出重定向到/tmp/et下,如果et文件中有内容则不会被覆盖,而是追加到et文件中。
2> 表示把错误输出重定向
例子:cat /etc/fstab 2> /tmp/fstab.out 表示将cat命令的错误信息重定向到/tmp/fstab.out中
>重定向的文件2>&1 表示将正确的和错误的都输出到一个文件中
例子:cat /etc/fstab > /tmp/fstab.out 2>&1
为了防止有时候的误操作,我们可以使用以下命令来限制我们的输入输出重定向
set -C 禁止覆盖信息已存在的文件
set +C 允许覆盖信息已存在的文件
>| :允许覆盖信息已存在的文件
&> :合并输出流至同一个数据流
4.2、Bash中变量的介绍
所谓变量其实就是可变化的量,也是一个有名称的内存空间。在linux中变量可以不用事先声明就可以直接对其进行赋值。
4.21、 Bash中的变量类型:
环境变量
环境变量的作用域是对其当前shell及其子shell都是有效的
使用declear –x 声明一个环境变量
本地变量
本地变量也称局部变量,其作用域是只对当前shell有效
使用Local声明一个局部变量
特殊变量
Bash中的内置变量,这里以最常用的$?为例简单说明一下
$?:表示引用上一条命令执行状态的返回值
返回0:表示上一条命令执行成功
返回1-255:表示上一条命令执行失败
位置变量
位置变量是用于引用传递过来的参数:$1,$2..${1,1}
4.22、 声明变量的类型:
声明变量的类型其实是声明了数据的存储格式和数据的表示范围。主要包括整型、字符型、布尔型、浮点型。
用declear来声明变量
Declear –i声明整型,-x 声明环境变量 ,-a声明数组,-r声明只读变量
4.23、变量的命名规则:
1. 只能包含字母,数字和下划线,并且不能以数字开头
2. 不能与关键字冲突
3. 见名知意
4.24、变量的引用:
使用 $+变量名 ,${变量名}
两种引用是有一定区别的,具体看下面例子
NAME=sun
Echo “the name is $NAMEy”
输出结果:the name is
Echo “the name is ${NAME}y”
输出结果:the name t suny
4.3、条件测试
条件测试是评估一个表达式;如果条件为真,则返回一个 0 值。如果表达式不为真,则返回一个大于 0 的值 — 也可以将其称为假值
条件测试的符号 []
[ expression ],[[ expression ]]
需要说明的是expression 的前后一定要留空格
测试数值之间的比较:
[ x –eq y ]测试x和y是否相等
[ x –eq y ]测试x和y是否相等
[ x –gt y ] 测试x 是否大于y
[ x –lt y ]测试x是否小于y
测试在字符串的比较
[ x=y ] 检查x与y是否相同
[ x!=y ] 测试x与y 是否不相同
-n x 若x不是空字符串(null)则为真
-z x 若x是空字符串则为真
例子:
测试 a 不等于 b 则输出1 否则输出 0
[root@root ~]# a=1
[root@root ~]# b=2
[root@root ~]#[ $a -ne $b ] && echo 1 || echo 0
1
条件测试的命令:test
test 文件运算符
test是评估一个表达式,然后返回真或假。如果它和 if、while 或 until 命令结合使用,则您可以对程序流进行广泛的控制
利用这些运算符,您可以在程序中根据对文件类型的评估结果执行不同的操作:
-b file 如果文件为一个块特殊文件,则为真
-c file 如果文件为一个字符特殊文件,则为真
-d file 如果文件为一个目录,则为真
-e file 如果文件存在,则为真
-f file 如果文件为一个普通文件,则为真
-g file 如果设置了文件的 SGID 位,则为真
-G file 如果文件存在且归该组所有,则为真
-k file 如果设置了文件的粘着位,则为真
-O file 如果文件存在并且归该用户所有,则为真
-p file 如果文件为一个命名管道,则为真
-r file 如果文件可读,则为真
-s file 如果文件的长度不为零,则为真
-S file 如果文件为一个套接字特殊文件,则为真
-t fd 如果 fd 是一个与终端相连的打开的文件描述符(fd 默认为 1),则为真
-u file 如果设置了文件的 SUID 位,则为真
-w file 如果文件可写,则为真
-x file 如果文件可执行,则为真
接下来我们就举一个测试文件是否存在的例子
[root@root ~]# test –e /etc/ff
1
返回值为1则说明这个文件不存在。
4.5、算数运算符
算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。Shell中常用的数学运算符如下所示。
+:对两个变量做加法。
-:对两个变量做减法。
*:对两个变量做乘法。
/:对两个变量做除法。
**:对两个变量做幂运算。
%:取模运算,第一个变量除以第二个变量求余数。
+=:加等于,在自身基础上加第二个变量。
-=:减等于,在第一个变量的基础上减去第二个变量。
*=:乘等于,在第一个变量的基础上乘以第二个变量。
/=:除等于,在第一个变量的基础上除以第二个变量。
%=:取模赋值,第一个变量对第二个变量取模运算,再赋值给第一个变量。
在bash脚本中可以使用如下三种方法计算结果并分别计算1+2的值
expr echo `expr 1+2` 其中``是一对反引号而不是单引号
$[] echo $[1+2]
let b=let 1+2 echo b 可以先赋值给一个变量b 然后输出b
4.6、逻辑运算
逻辑运算符有:
&& 表示逻辑与运算 双目操作符,两边都为真时才为真否则为假
|| 表示逻辑或运算 双目操作符,两边都为假时才为佳否则为真
! 表示非运算 单目操作符,为真则为假
[root@root ~]#id redhat && echo “redhat” || useradd redhat && echo “redhat”
这句话首先判断redhat用户是否存在,如果存在则为真然后输出 不过不存在就是假则直接执行 || 后面的内容 增加redhat用户然后输出。
在这三种运算符中,非运算的优先级最高,在运算中都是自左而右的运算。
4.7、用户如何自定义输入
read 变量名
例:read – p “input your name” NAME
其中加上-P选项可以键入提示,用户可以更清楚的知道自己想要输入的东西