1. 什么是shell script
shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。
简单的说, shell script 就像是早期 DOS 年代的批处理文件 (.bat) ,最简单的功能就是将许多指令汇整写在一起, 让使用者很轻易的就能够 one touch 的方法去处理复杂的动作 (执行一个文件 "shell script" ,就能够一次执行多个指令)。 而且 shell script 更提供数组、循环、条件与逻辑判断等重要功能,让用户也可以直接以 shell 来撰写程序,而不必使用类似 C 程序语言等传统程序撰写的语法呢!
我的理解:
是一个程序,通过这个程序的语法,你可以操作linux系统上的资源。比如我们发布服务,需要设置环境变量,清理目录,上传jar包等操作。
2. 为什么要学习
2.1 自动化管理的重要依据
管理一部主机真不是件简单的事情,每天要进行的任务就有:查询登录档、追踪流量、监控用户使用主机状态、主机各项硬设备状态、 主机软件更新查询、更不要说得应付其他使用者的突然要求了。而这些工作的进行可以分为: (1)自行手动处理,或是 (2)写个简单的
程序来帮你每日『自动处理分析』这两种方式,你觉得哪种方式比较好? 当然是让系统自动工作比较好,对吧!呵呵~这就得要良好的 shell script 来帮忙的啦!
2.2 连续指令单一化
其实,对于新手而言, script 最简单的功能就是:『汇整一些在 command line 下达的连续指令,将他写入 scripts 当中,而由直接执行 scripts 来启动一连串的 command line 指令输入!』例如: 防火墙连续规则 (iptables),开机加载程序的项目 (就是在 /etc/rc.d/rc.local 里头的数据) ,等等都是相似的功能啦! 其实,说穿了,如果不考虑 program 的部分,那么 scripts 也可以想成『仅是帮我们把一大串的指令汇整在一个文件里面, 而直接执行该文件就可以执行那一串又臭又长的指令段!』就是这么简单啦!
3. script 的执行方式差异
3.1 利用直接执行的方式来执行 script
当使用直接指令下达 (不论是绝对路径/相对路径还是 ${PATH} 内),或者是利用 bash (或 sh) 来下达脚本时, 该 script 都会使用一个新的 bash 环境来执行脚本内的指令!也就是说,使用这种执行方式时, 其实 script 是在子程序的 bash 内执行的!
3.2 利用 source 来执行脚本:在父程序中执行
该 script 都会使用原来的bash 环境来执行脚本内的指令!这也是为啥你不注销系统而要让某些写入 ~/.bashrc 的设定生效时,需要使用『 source ~/.bashrc 』而不能使用『 bash ~/.bashrc 』
4. shell脚本判断语法
4.1 test命令
test -e /dmtsai && echo "exist" || echo "Not exist"
&& 左边成功右边就执行,否则就不执行
|| 左边false右边就执行,否则不执行
-e 表示档案是否存在,无论是文件还是文件夹形式。还有其他参数
4.1.1 关于某个档名的『文件类型』判断
test -e file
-e 该『档名』是否存在?
-f 该『档名』是否存在,且为文件
-d 该『档名』是否存在,且为目录
4.1.2 关于文件权限侦测
test -r file
-r 该文件是否存在且具有读取权限
-w 该文件是否存在且具有写入权限
-x 该文件是否存在且具有执行权限
4.1.3 两个文件之间的比较
test file1 -nt file2
-nt (newer than) file1文件比file2文件新
-ot (older than)file1文件比file2文件旧
4.1.4 两个整数之间的判断
test n1 -eq n2
-eq 两值相等
-ne 两值不等
-gt n1大于n2
-lt n1小于n2
-ge n1大于等于n2
-le n1小于等于n2
4.1.5 判定字符串的数据
test -z string 判断字符串是否为空,如果是,true
test -n string 判断字符串是否不为空,如果不为空,true
test str1 == str2 判断两字符串是否相等
test str1 != str2 判断两字符串不等
4.1.6 多重条件判断
test -r filename -a -x filename file同时具有r和x权限才为真
test -r filename -o -x filename file具有r或者x权限就为真
4.1.7 示例
test ! -e ${filename} && echo "The filename '${filename}' DO NOT exist" && exit 0
4.2 判断符号 [ ]
示例:
[ $HOME" == "$MAIL" ]
- 在中括号 [] 内的每个组件都需要有空格键来分隔;
- 在中括号内的变数,最好都以双引号括号起来;
- 在中括号内的常数,最好都以单或双引号括号起来
示例:
[ "${yn}" == "Y" -o "${yn}" == "y" ] && echo "OK, continue" && exit 0
4.3 脚本入参说明
我们知道命令可以带参数,比如 ls -al。al是参数。 那么脚本是否可以带参数,比如 sh ***.sh start. start是参数。答案啊可以的,那么脚本里面如何识别参数呢
假设命令为:sh home.sh param1 param2 param3
脚本里面
$0 代表脚本内容 home.sh
$1 代表第一个参数 param1
$2 代表第二个参数 param2
$# 代表参数的个数,这里是3
4.2 if 判断命令
格式如下:
多个条件判断 (if ... elif ... elif ... else) 分多种不同情况执行
if [ 条件判断式一 ]; then
当条件判断式一成立时,可以进行的指令工作内容;
elif [ 条件判断式二 ]; then
当条件判断式二成立时,可以进行的指令工作内容;
else
当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi
示例:
if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then
echo "OK, continue"
elif [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then
echo "Oh, interrupt!"
else
echo "I don't know what your choice is"
fi
4.3 while 循环命令
while [ condition ] <==中括号内的状态就是判断式
do <==do 是循环的开始!
程序段落
done <==done 是循环的结束
示例:
while [ "${yn}" != "yes" -a "${yn}" != "YES" ]
do
read -p "Please input yes/YES to stop this program: " yn
done
echo "OK! you input the correct answer."
4.4 shell script 的追踪与 debug
sh [-nvx] scripts.sh
选项与参数:
-n :不要执行 script,仅查询语法的问题;
-v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
-x :将使用到的 script 内容显示到屏幕上,这是很有用的参数!