shell script是利用shell的功能所写的一个“程序”,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的。
什么是shell script
编写
shell script其实就是纯文本文件,我们可以编辑这个文件,然后让这个文件来帮我们一次执行多个命令,或者利用一些运算与逻辑判断来帮我们达成某些功能。在shell script的编写中还需要用到下面的注意事项:
- 命令的执行时从上而下、从左而右的分析与执行;
- 命令的执行中,命令、参数间的多个空白都会被忽略掉;
- 空白行也将被忽略掉,并且[tab]按键所得的空白同样视为空格键;
- 如果读取到一个Enter符号(CR),就尝试开始执行(或该串)命令;
- 至于如果一行的内容太多,则可以使用“[Enter]”来扩展至下一行;
- “#”可作为批注。任何加在#后面的数据将全部被视为批注文字而被忽略。
通过一个例子来说明shell script中的内容。
#!/bin/bash
# Program:
# This program shows “Hello World” in your screen.
# History:
# 2017/02/22 Avin First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo –e “Hello World! \a \n”
exit 0
一般的shell script主要分为5段:
- 第1行声明script使用的shell名称;
- 第2~5行是程序内容的说明;
- 第6~7行是主要环境变量的声明;
- 第8行是主要的程序部分;
- 第9行是告知执行结果。
执行
shell script的执行可以通过直接命令执行和以bash进程来执行,也可以利用source来执行脚本。
判断式
test命令
检测系统上面某些文件或者相关的属性时,利用test命令非常方便。test命令的参数及意义如下表所示:
判断符号[]
除了使用test之外,还可以使用判断符号“[]”(中括号)来进行数据的判断。使用中括号需要注意,因为在中括号使用在很多地方,如果在bash的语法中使用中括号最为shell的判断式时,必须要注意中括号的两端需要有空格符来分隔。
此外,使用中括号的其他注意事项:
- 在中括号[]内的每个组件都需要有空格键来分隔;
- 在中括号内的变量,最好都以双引号括起来;
- 在中括号内的常量,最好都以单或双引号括起来。
默认变量
script针对参数已经有设置好一些变量名称: 0, 1,$2•••,除了这些数字变量外,还有一些较为特殊的变量可以在script内使用来调用这些参数。
- $#:代表后接的参数“个数”;
- @:代表” 1”、” 2”、” 3”、”$4”之意,每个变量是独立的;
- ∗:代表“” 1c 2c 3c$4””,其中c为分隔字符,默认为空格键。
在script中可以使用shift来造成参数变量号码偏移。
条件判断式
if…then
if…then是最常见的条件判别式了,简单的说,就是当符合某个条件判断的时候,就进行某项工作。这个判别式的使用还分为多种情况。
- 单层、简单条件判别式
if [ 条件判断式 ];then
当条件判断式成立时,可以进行的命令工作内容
fi
如果有多个条件进行判断时,可以使用多个中括号隔开,在括号和括号之间使用&&或||隔开,&&代表AND,||代表or。
- 多重、复杂条件判断式
if [ 条件判断式 ];then
当条件判断式成立时,可以进行的命令工作内容
else
当条件判断式不成立时,可以进行的命令工作内容
fi
if [ 条件判断式一 ];then
当条件判断式一成立时,可以进行的命令工作内容
elif [ 条件判断式二 ];then
当条件判断式二成立时,可以进行的命令工作内容
else
当条件判断式一与二均不成立时,可以进行的命令工作内容
fi
case…esac
对于一个变量的多种可能值情况进行判别操作的时候,可以使用case…in…esac。
case $变量名称 in
“第一个变量内容”)
程序段
;;
“第二个变量内容”)
程序段
;;
*)
不包含第一个变量内容与第二个变量内容的其他程序执行段
exit 1
;;
esac
function
函数可以在shell script当中作出一个类似自定义执行命令的东西,可以简化很多的程序代码。因为shell script的执行方式是由上而下、由左而右,因此在shell script当中的function的设置一定要在程序的最前面。function也是拥有内置变量的,它的内置变量与shell script很类似,函数名称代表 0,而后续接的变量也是以 1,$2…来替代的。
function fname() {
程序段
}
循环(loop)
while do done, until do done
不定循环最常见的就是这两种。
while [ condition ]
do
程序段落
done
until [ condition ]
do
程序段落
done
for…do…done
相对于while、until的循环方式是必须要“符合某个条件”的状态,for这种语法则是“已经知道循环的次数”的状态。
for var in con1 con2 con3 …
do
程序段
done
除了上面的方法之外,for循环还有一种写法。
for ( ( 初始值; 限制值; 执行步长 ) )
do
程序段
done
追踪与调试
在编写shell script时,很容易出现语法错误或者其它问题,将会导致执行失败,在执行之前可以使用bash的相关参数来进行判断。
bash [-nvx] script.sh
参数:
-n:不要执行script,仅查询语法的问题
-v:在执行script前,先将script的内容输出到屏幕上
-x:将使用到的script内容显示到屏幕上