linux 基础学习之四:shell脚本学习(1)

1、shell脚本概述
什么是 shell script 呢? 
shell 我们在 认识 bash 当中已经提过了,那是一个文字接口底下让我们与系统沟通的一个工具接口,那么 script 是啥? 字面上的意义, script 是『脚本、剧本』的意思。整句话是说, shell script 是针对 shell 所写的『剧本!』 什么东西啊?呵呵!其实, shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文字文件,将一些 shell 的语法与指令写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。 所以,简单的说, shell script 就像是早期 DOS 年代的批次檔 (.bat) ,最简单的功能就是将许多指令汇整写在一起, 让使用者很轻易的就能够 one touch (执行一个档案 "shell script" ,就能够一次执行多个指令), 而, shell script 更提供数组、循环、条件与逻辑判断等重要功能,让使用者也可以直接以 shell 来撰写程序,而不必使用类似 C 程序语言等传统程序撰写的语法呢! 不需要编译即可执行,且拥有不错的除错 (debug) 工具,所以,他可以帮助系统管理员快速的管理好主机。
干嘛学习 shell scripts?
• 自动化管理的重要依据:
不用鸟哥说您也知道,管理一部主机真不是件简单的事情,每天要进行的任务就有: 查询登录档、追踪流量、监控使用者使用主机状态、主机各项硬设备状态、 主机软件更新查询、更不要说得应付其它使用者的突然要求了。而这些工作, 您想要自行手动处理,还是写个简单的程序来帮您每日自动处理分析,若有问题才通知您呢? 当然是让系统自动工作比较好,对吧!呵呵~这就得要良好的 shell script 来帮忙的啦!
• 追踪与管理系统的重要工作:
虽然我们还没有提到服务启动的方法,不过,这里可以先提一下,我们 Linux 系统的服务 ( services ) 启动的接口,在 /etc/init.d/ 这个目录下,所有的档案都是 scripts ; 另外,包括开机 (booting) 过程也都是利用 shell script 来帮忙搜寻系统的相关设定数据, 然后再代入各个服务的设定参数啊!举例来说,如果我们想要重新启动系统登录文件, 可以使用:『/etc/init.d/syslogd restart』,那个 syslogd 档案就是 script 啦! 另外,我曾经在某一代的 FC 上面发现,启动 MySQL 这个数据库服务时,确实是可以启动的, 但是屏幕上却老是出现『failure』,后来才发现,原来是启动 MySQL 那个 script 会主动的以『空的密码』去尝试登入 MySQL ,但我修改过 MySQL 的密码啰~当然就登入失败~ 后来改了改 script ,就略去这个问题啦!如此说来, script 确实是需要学习的啊!
• 简单入侵侦测功能:
当我们的系统有异状时,大多会将这些异状记录在系统记录器,也就是我们常提到的『系统登录文件』, 那么我们可以在固定的几分钟内主动的去分析系统登录文件,若察觉有问题,就立刻通报管理员, 或者是立刻加强防火墙的设定规则,如此一来,您的主机可就能够达到『自我保护』的聪明学习功能啦~ 举例来说,我们可以通过 shell script 去分析『当该封包尝试几次还是联机失败之后,就予以抵挡住该 IP』之类的举动,例如鸟哥写过一个关于抵挡砍站软件的 shell script , 就是用这个想法去达成的呢!
• 连续指令单一化:
其实,对于新手而言, script 最简单的功能就是:『汇整一些在 command line 下达的连续指令,将他写入 scripts 当中,而由直接执行 scripts 来启动一连串的 command line 指令输出入!』例如: 防火墙连续规则 ( iptables ),开机加载程序的项目 ( 就是在 /etc/rc.d/rc.local 里头的数据 ) ,等等都是相似的功能啦! 其实,说穿了,如果不考虑 program 的部分,那么 scripts 也可以想成,仅是帮我们把一大串的指令汇整在一个档案里面, 而直接执行该档案就可以执行那一串又臭又长的指令段!就是这么简单啦!
• 简易的数据处理:
由前一章 正规表示法 的 awk 程序说明中, 您可以发现, awk 可以用来处理简单的数据数据呢!例如薪资单的处理啊等等的。 shell script 的功能更强大,例如鸟哥曾经用 shell script 直接处理数据数据
的比对啊, 文字数据的处理啊等等的,撰写方便,速度又快(因为在 Linux 效能较佳), 真的是很不错用的啦!
• 跨平台支持与学习历程较短:
几乎所有的 Unix Like 上面都可以跑 shell script ,连 MS Windows 系列也有相关的仿真器可以用, 此外, shell script 的语法是相当亲和的,看都看的懂得文字,而不是机器码, 很容易学习~这些都是您可以加以考虑的学习点啊!
上面这些都是您考虑学习 shell script 的特点~此外, shell script 还可以简单的以 vi 来直接编写,实在是很方便的好东西!所以,还是建议您学习一下啦。 不过,虽然 shell script 号称是程序 (program) ,但实际上, shell script 处理数据的速度上是不太够的。因为 shell script 用的是外部的指令与 bash shell 的一些预设工具,所以,他常常会去呼叫外部的函式库,因此,运算速度上面当然比不上传统的程序语言。 所以啰, shell script 用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了~而且还很麻烦,因为:Shell scripts 的速度较慢, 且使用的 CPU 资源较多,造成主机资源的分配不良。还好, 我们确实很少看到利用 shell script 在进行大量数据运算的,所以,不必担心的啦!
2、开始shell script编写
写第一个shell 脚本(名字叫sh01吧):
#!/bin/bash       ——第一行不是注释,用来宣告这个脚本用的shell名称,我们用的是bash。               
#program:       ——以下所有的 # 都是注释了。           
# this program is used to show "hello world!" in screen.
# history:
#2012/06/15   mumu  1.0 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
执行的话可以用:sh sh01 或者./sh01 都可以执行咯。
下面看第二个shell脚本:
想象一个状况,如果我每天要进行备份,而备份的数据又不想被覆盖掉,也就是说, 我想要将每天备份的数据放在不同的档案中。哇!这真困扰啊?难道要我每天去修改 script ? 不需要啊!因为每天的『日期』并不相同,所以我可以将档名取成类似: backup.20050802 , 不就可以每天一个不同档名了吗?呵呵!确实如此。好了,接下来出个例子: 我想要建立三个空的档案,档名最开头由使用者输入决定,假设使用者输入 filename 好了, 那今天的日期是 2005/08/23 ,我想要以前天、昨天、今天的日期来建立这个档案,亦即 filename_20050821, filename_20050822, filename_20050823 ,该如何是好?
[root@linux scripts]# vi sh03.sh
#!/bin/bash
# Program:
# User can keyin filename to touch 3 new files.
# History:
# 2005/08/23 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 1. 让使用者输入文件名称,并取得 fileuser 这个变量;
echo -e "I will use 'touch' command to create 3 files."
read -p "Please input the filename what you want: " fileuser
# 2. 为了避免使用者随意按 Enter ,利用变量功能分析文件名是否有设定?
filename=${fileuser:-"filename"}       ————现在filename已经取得了fileuser的输入值。
# 3. 开始利用 date 指令来取得所需要的档名了;
date1=`date --date='2 days ago' +%Y%m%d`         ————注意这里,里面有两个单引号,但是外面这俩不是(是:数字1左边的键` 表示先执行里面的命令,大写Y是年的全写,小写y是年份的后两位。),
date2=`date --date='1 days ago' +%Y%m%d`
date3=`date +%Y%m%d`
file1="$filename""$date1"
file2="$filename""$date2"
file3="$filename""$date3"
# 4. 将档名建立吧! 建立文件。如果我们想看看这个shell脚本的输出,可以把touch 换成echo 命令,这样就不用创建文件了。
touch $file1
touch $file2
touch $file3

这样在执行ls 命令,即可查看新建立的三个新的文件。。

数值运算的方法
各位看官应该还记得,我们可以使用 declare 来定义变量的类型吧?! 这样才能够进行加减运算啊!可惜的是, bash shell 里头预设仅支持到整数的数据。 OK!那我们来玩玩看,如果我们要使用者输入两个变量,然后将两个变量的内容相乘, 最后输出相乘的结果,那可以怎么做?
[root@linux scripts]# vi sh04.sh
#!/bin/bash
# Program:
# User can input 2 integer to cross by!
# History:
# 2005/08/23 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "You SHOULD input 2 number, I will cross they! \n"
read -p "first number: " firstnu
read -p "second number: " secnu
total=$(($firstnu*$secnu))      ————注意这个地方,是两个括号,我也不知道为啥。如果是一个括号就出错。
echo -e "\nThe number $firstnu x $secnu is ==> $total"






				
时间: 2024-11-03 21:26:34

linux 基础学习之四:shell脚本学习(1)的相关文章

shell脚本学习与总结_linux shell

1.shell 脚本是区分小写的2.Unix特殊字符有: ( ; $ ? & * () [] ` ' " + 使用其时要进行转义()3.Shell的注释以#开头4.函数的定义Function fuction_name(){Command to execute}调用时直接用function_name.5.控制结构1)If...then语句If [ test_command ]ThenCommandsif2)If...then...else语句If [ test_command ]ThenC

linux 基础学习之五:shell脚本学习(2)——基本语法

1. 第一行必须是"#!/bin/sh" 它不是注释,"#!/bin/sh"是对shell的声明,说明你所用的是那种类型的shell及其路径所在: 如果没有声明,则脚本将在默认的shell中执行,默认shell是由用户所在的系统定义为执行shell脚本的shell. 如果脚本被编写为在Kornshell ksh中运行,而默认运行shell脚本的为C shell csh,则脚本在执行过程中很可能失败. 所以建议大家就把"#!/bin/sh"当成C

linux shell脚本学习xargs命令使用详解_linux shell

xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据.xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代. xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子. 1.

shell脚本学习指南[五](Arnold Robbins & Nelson H.F. Beebe著)_linux shell

作者告诉我们:到目前为止基础已经搞定,可以将前边所学结合shell变成进军中等难度的任务了.激动的要哭了,终于看到本书结束的曙光了 T T .码字比码代码还辛苦.不过令人兴奋的是立刻就学以致用了,花了一天半的时间处理了一个3.8G的服务器日志文件,你妹啊,破电脑内存才2G.不过切割化小然后写了几个awk文件和sh文件按规则处理合并,算是搞定了! 第十一章扩展实例:合并用户数据库 问题描述就是有两台UNIX的计算机系统,这两个系统现在要合并,用户群同样需要合并.有许多用户两台系统上都有帐号.现在合

shell脚本学习指南[三](Arnold Robbins & Nelson H.F. Beebe著)_linux shell

今天木有冷笑话,只有一个噩耗.噩耗是:今天木有冷笑话!!!不要总想着冷笑话嘛,有点追求,听毛主席的话:好好学习,天天向上! 第七章输入输出.文件与命令执行 学C的应该了解标准输入输出和错误输出吧?感觉总打很多字进度太慢,所以一直在省略类似C的东西,也方便以后看这篇文章的人能够快速学完shell脚本(或者是快速看完这本书). 读取行read命令是重要方式之一,它可以自标准输入读取行后,通过shell字段切割的功能(使用$IFS)进行切分,第一部分给第一个变量,第二部分给第二个,类推.如果切割单词多

shell脚本学习指南[一](Arnold Robbins & Nelson H.F. Beebe著)_linux shell

第一章略过,下边从第二章开始,大家懂得.ps:这里发生了一件非常当我蛋疼的事情,非常!已经码文章码到第四章了,悲剧的按错浏览器按钮刷新掉,怎么也找不回来之前写的东西了.想死!算了,复习一边吧.以下全文均属自己总结书写,有错误的地方也未必是书中错误(当然也有可能是书中错误,但是我都会亲自操作滴),可能是我写错,请大牛指正. 第二章入门 因为第二遍写,就简单快速的写吧,尽量写清楚.大家都知道的终端命令cd啊 chmod啊 who啊之类的组合在一起加上一些控制语句,变量什么的就成shell编程了,给出

shell脚本学习指南[二](Arnold Robbins & Nelson H.F. Beebe著)_linux shell

该进入第四章了,刚才看到一个帖子标题:我空有一身泡妞的好本领,但可惜自己是个妞.汗-这个...音乐无国界嘛,这个不应该也没性别界么? 第四章文本处理工具 书中先说明了以下排序的规则,数值的就不用说了,该大就大该小就小,但是字符型很多时候是区分声调或者重音的.在命令行中输入locale查看自己系统的编码配置.默认的是系统配置里的,但是可以自己设置排序的编码.如: 复制代码 代码如下: $ LC_ALL=C sort french-english #以传统ASCII码顺序排序 下边介绍以下排序命令s

shell脚本学习指南[六](Arnold Robbins & Nelson H.F. Beebe著)_linux shell

学shell到现在了,一直以为自己不会犯一个大家常说的非常二的问题,结果这本书最后的时候犯了个十分2的事,晚节不保啊!!!我在测试文件路径下除了通配符*和?外还能用啥正则那样的东西,结果就在$HOME下执行了rm .* ...好吧,蛋疼了一下午!还木找回任何一个配置文件.警示后人,千万别使用rm试通配符!任何时候小心使用rm! 第十四章shell可移植性议题和扩展 可以先通读这篇文章.想写出好的可移植性shell,不仅要了解各种shell版本间的差异,还要有很多编程技巧,比如尽量从环境变量中获取

《Linux命令行与Shell脚本编程大全第2版》读书笔记

公司说不准用云笔记了,吓得我赶紧把笔记贴到博客上先..... 近3年前的了,只有一半的章节,后面的没空记录了.... 第1章 可以cat /proc/meminfo文件来观察Linux系统上虚拟内存的当前状态 ipcs命令专门用来查看系统上的当前共享内存页面 Ubuntu使用一个表来管理在系统开机时要自动启动的进程,在/etc/init.d目录,可将开机时启动或停止某个应用的脚本放在这个目录下.这些脚本通过/etc/rcX.d目录下的入口启动,这里X代表运行级(run level) Linux才