第十三章、学习 Shell Scripts
什么是 Shell scripts
shell script (程序化脚本) :shell script 是针对 shell 所写的『脚本!』
shell script 是利用 shell 的功能所写的一个『程序
(program)』,这个程序是使用纯文字档,将一些 shell 的语法与命令(含外部命令)写在里面,
搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。
shell script 就像是早期 DOS 年代的批量档 (.bat) ,最简单的功能就是将许多命令汇整写在一起,
让使用者很轻易的就能够 以one touch 的方法去处理复杂的动作 (运行一个文件 "shell script" ,就能够一次运行多个命令)。
shell script 可以被看成是批量档,
也可以被说成是一个程序语言,且这个程序语言由於都是利用 shell 与相关工具命令,
所以不需要编译即可运行,且拥有不错的除错 (debug) 工具。
干嘛学习 shell scripts
- 自动化管理的重要依据:
管理一部主机每天要进行的任务就有:
查询登录档、追踪流量、监控使用者使用主机状态、主机各项硬件设备状态、
主机软件升级查询。工作方式可以分为:
(1)自行手动处理,或是 (2)写个简单的程序来帮你每日自动处理分析 - 追踪与管理系统的重要工作:
Linux 系统的服务
(services) 启动脚本在 /etc/init.d/ 目录下,目录下的所有文件都是 scripts ;
另外,包括启动 (booting) 过程也都是利用 shell script 来帮忙搜寻系统的相关配置数据,
然后再代入各个服务的配置参数!举例来说,如果我们想要重新启动系统登录档,
可以使用:『/etc/init.d/syslogd restart』,那个 syslogd 文件就是 script!另外,鸟哥曾经在某一代的 Fedora 上面发现,启动 MySQL 这个数据库服务时,确实是可以启动的,
但是萤幕上却老是出现『failure』!后来才发现,原来是启动 MySQL 那个 script
会主动的以『空的密码』去尝试登陆 MySQL ,但为了安全性鸟哥修改过 MySQL 的密码,
后来改了改 script ,就解决了这个问题! - 简单入侵侦测功能:
当我们的系统有异状时,大多会将这些异状记录在系统记录器,也就是我们常提到的『系统登录档』,
那么我们可以在固定的几分钟内主动的去分析系统登录档,若察觉有问题,就立刻通报管理员,
或者是立刻加强防火墙的配置守则,如此一来,你的主机可就能够达到『自我保护』。
举例来说,我们可以通过 shell script 去完成『当该封包尝试几次还是连线失败之后,就予以抵挡住该
IP』,例如鸟哥写过一个关於抵挡砍站软件的 shell script! - 连续命令单一化:
『仅是帮我们把一大串的命令汇整在一个文件里面,
而直接运行该文件就可以运行那一串又臭又长的命令段!』 - 简易的数据处理:
awk 可以用来处理简单的数据!例如薪资单的处理等等的。如鸟哥曾经用 shell script 直接处理数据数据的比对啊,
文字数据的处理等等的 - 跨平台支持与学习历程较短:
几乎所有的 Unix Like 上面都可以跑 shell script ,连 MS Windows 系列也有相关的 script 模拟器可以用,
此外, shell script 的语法是相当亲和的
shell script
处理数据的速度是不快。因为 shell script 用的是外部的命令与 bash shell
的一些默认工具,所以,他常常会去呼叫外部的函式库,因此,运算速度上面比不上传统程序语言。 shell script 用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上,
就不够好了,因为 Shell scripts 的速度较慢,且使用的 CPU 资源较多,造成主机资源的分配不良。
第一支 script 的撰写与运行
shell script是纯文字档
注意事项:
- 命令的运行是从上而下、从左而右的分析与运行;
- 命令的下达:
命令、选项与参数间的多个空白都会被忽略掉; - 空白行也将被忽略掉,并且 [tab] 按键所推开的空白同样视为空白键;
- 如果读取到一个 Enter 符号 (CR) ,就尝试开始运行该行 (或该串) 命令;
- 如果一行的内容太多,则可以使用『 \[Enter] 』来延伸至下一行;
- 『 # 』可做为注解!任何加在 # 后面的数据将全部被视为注解文字而被忽略!
在 script 内所撰写的程序会被一行一行的运行。现在我们假设你写的这个程序档名是
/home/dmtsai/shell.sh 好了,如何运行:
- 直接命令下达: shell.sh 文件必须要具备可读与可运行 (rx) 的权限,然后:
- 绝对路径:使用 /home/dmtsai/shell.sh 来下达命令;
- 相对路径:假设工作目录在 /home/dmtsai/ ,则使用 ./shell.sh 来运行
- 变量『PATH』功能:将 shell.sh 放在 PATH 指定的目录内,例如: ~/bin/
- 以 bash 程序来运行:透过『 bash shell.sh 』或『 sh shell.sh 』来运行
/bin/sh 是 /bin/bash (连结档),使用 sh shell.sh
亦即告诉系统,直接以 bash 的功能来运行 shell.sh 这个文件内的相关命令,所以此时 shell.sh 只要有 r 的权限即可被运行!也可以利用 sh 的参数,如 -n 及 -x
来检查与追踪 shell.sh 的语法是否正确
- 撰写第一支 script
[root@www ~]# mkdir scripts; cd scripts |
- 第一行 #!/bin/bash 在宣告这个 script 使用的 shell 名称:
因为我们使用的是 bash ,所以,必须要以『 #!/bin/bash 』来宣告这个文件内的语法使用
bash 的语法!那么当这个程序被运行时,他就能够加载 bash 的相关环境配置档 (一般来说就是 non-login shell 的 ~/.bashrc),
并且运行 bash 来使我们底下的命令能够运行!(在很多状况中,如果没有配置好这一行,
那么该程序很可能会无法运行,因为系统可能无法判断该程序需要使用什么 shell 来运行!) - 程序内容的说明:
整个 script 当中,除了第一行的『 #! 』是用来宣告 shell 的之外,其他的 # 都是『注解』用途!
所以上面的程序当中,第二行以下就是用来说明整个程序的基本数据。一般来说,
建议你一定要养成说明该 script 的:1. 内容与功能; 2. 版本资讯; 3. 作者与联络方式;
4. 建档日期;5. 历史纪录 等等。这将有助於未来程序的改写与 debug! - 主要环境变量的宣告:
建议务必要将一些重要的环境变量配置好,鸟哥个人认为, PATH 与 LANG (如果有使用到输出相关资讯时) 是当中最重要的!
如此一来,则可让我们这支程序在进行时,可以直接下达一些外部命令,而不必写绝对路径呢! - 主要程序部分
就将主要的程序写好即可!在这个例子当中,就是 echo 那一行啦! - 运行成果告知 (定义回传值)
一个命令的运行成功与否,可以使用
$? 这个变量来观察,可以利用 exit 这个命令来让程序中断,并且回传一个数值给系统。
在我们这个例子当中,鸟哥使用 exit 0 ,这代表离开 script 并且回传一个 0 给系统,
所以我运行完这个 script 后,若接著下达 echo $? 则可得到 0 的值!
[root@www scripts]# sh sh01.sh |
另外,你也可以利用:『chmod a+x sh01.sh; ./sh01.sh』来运行这个 script !
撰写 shell script 的良好习惯创建
- script 的功能;
- script 的版本资讯;
- script 的作者与联络方式;
- script 的版权宣告方式;
- script 的 History (历史纪录);
- script 内较特殊的命令,使用『绝对路径』的方式来下达;
- script 运行时需要的环境变量预先宣告与配置。
第十三章、学习 Shell Scripts的更多相关文章
- 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)
第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...
- 鸟哥的Linux私房菜——第十六章:学习Shell Scripts
视频链接:http://www.bilibili.com/video/av10565321/ 1. 什么是 Shell Script (shell写的脚本)1.1 干嘛学习 shell s ...
- 《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记
第二十三章:使用数据库 MySQL数据库 MySQL客户端界面 mysql命令行参数 参数 描述 -A 禁用自动重新生成哈希表 -b 禁用 出错后的beep声 -B 不使用历史文件 -C 压缩客户端和 ...
- 鸟哥的linux私房菜——第十三章学习(Linux 帐号管理与 ACLL 权限设置)
第十三章.Linux 帐号管理与 ACLL 权限设置 1.0).使用者识别码: UID 与 GID UID :User ID GID :group ID [root@study ~]# ll -d / ...
- 第十三章、学习 Shell Scripts 条件判断式
利用 if .... then 单层.简单条件判断式 if [ 条件判断式 ]; then 当条件判断式成立时,可以进行的命令工作内容: fi <==将 if 反过来写,就成为 fi !结束 i ...
- 第十三章、学习 Shell Scripts 善用判断式
善用判断式 利用 test 命令的测试功能 我要检查 /dmtsai 是否存在时,使用: [root@www ~]# test -e /dmtsai [root@www ~]# test -e /dm ...
- 第十三章、学习 Shell Scripts 简单的 shell script 练习
简单的 shell script 练习 简单范例 对谈式脚本:变量内容由使用者决定 [root@www scripts]# vi sh02.sh #!/bin/bash # Program: # Us ...
- 第十三章、学习 Shell Scripts 循环 (loop)
while do done, until do done (不定循环) while [ condition ] <==中括号内的状态就是判断式 do <==do 是回圈的开始! 程序段落 ...
- 第13章 学习shell script
由于博客园中dollar符号有别的意义,所以文中的dollar符号使用¥表示 第一个script [root@localhost script]# cat -n sh01.sh #!/bin/bash ...
随机推荐
- 【POJ 3335】 Rotating Scoreboard (多边形的核- - 半平面交应用)
Rotating Scoreboard Description This year, ACM/ICPC World finals will be held in a hall in form of a ...
- ajax的GET和POST请求
GET和POST请求 GET请求时最常见的请求类型,用于向服务器查询信息,必要时可以将查询字符串参数放在URL尾部发送给服务器,如果参数有特殊字符必须正确编码.我们上面使用的例子都是使用GET请求,非 ...
- 关于结构体的PPT
http://wenku.baidu.com/link?url=bd75dv-I7pCuw9M7W8iFqu6jti6XPdUqVYDC1sXegmMpaacY7TPo-P9Vx38b8zBLj6Nd ...
- 在Ubuntu 12.04安装和设置Samba实现网上邻居共享
转载:http://www.startos.com/ubuntu/tips/2012031333097.html 有微小改动. Samba 是一款功能强大的共享工具,可以实现与win ...
- Monitor vs WaitHandle
http://stackoverflow.com/questions/1355398/monitor-vs-waithandle-based-thread-sync A problem with Mo ...
- UVa 658 (Dijkstra) It's not a Bug, it's a Feature!
题意: 有n个BUG和m个补丁,每个补丁用一个串表示打补丁前的状态要满足的要求,第二个串表示打完后对补丁的影响,还有打补丁所需要的时间. 求修复所有BUG的最短时间. 分析: 可以用n个二进制位表示这 ...
- POJ 2391 Ombrophobic Bovines ★(Floyd+二分+拆点+最大流)
[题意]有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 和POJ2112很类 ...
- win8.1 64 安装用友T3+sql2005-64步骤
1. 环境:win8.1 64 专业版 4G内存 .net framwork 3.5 2.初始过程及所需软件 安装sql2008数据库,安装完T3发现并不支持此数据库,运行T3老是出现连接数据时的 ...
- Spring AOP前置通知和后置通知
Spring AOP AspectJ:Java社区里最完整最流行的AOP框架 在Spring2.0以上的版本中,可以使用基于AspectJ注解或基于XML配置的AOP 在Spring中启用Aspect ...
- asp.net微信公众平台开发
http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97 ...