Shell脚本学习一

终于到shell 脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实
shell脚本在linux系统管理员的运维工作中非常非常重要。下面笔者就带你正式进入shell
脚本的世界吧。
到现在为止,你明白什么是shell脚本吗?如果明白最好了,不明白也没有关系,相信
随着学习的深入你就会越来越了解到底什么是shell脚本。首先它是一个脚本,并不能作为
正式的编程语言。因为是跑在linux的shell中,所以叫shell脚本。说白了,shell脚本就是
一些命令的集合。举个例子,我想实现这样的操作:1)进入到/tmp/目录;2)列出当前目
录中所有的文件名;3)把所有当前的文件拷贝到/root/目录下;4)删除当前目录下所有的
文件。简单的4步在shell窗口中需要你敲4次命令,按4次回车。这样是不是很麻烦?当
然这4步操作非常简单,如果是更加复杂的命令设置需要几十次操作呢?那样的话一次一次
敲键盘会很麻烦。所以不妨把所有的操作都记录到一个文档中,然后去调用文档中的命令,
这样一步操作就可以完成。其实这个文档呢就是shell脚本了,只是这个shell脚本有它特殊
的格式。

Shell脚本能帮助我们很方便的去管理服务器,因为我们可以指定一个任务计划定时去
执行某一个shell脚本实现我们想要需求。这对于linux系统管理员来说是一件非常值得自豪
的事情。现在的139邮箱很好用,发邮件的同时还可以发一条邮件通知的短信给用户,利用
这点,我们就可以在我们的linux服务器上部署监控的shell脚本,比如网卡流量有异常了或
者服务器web服务器停止了就可以发一封邮件给管理员,同时发送给管理员一个报警短信
这样可以让我们及时的知道服务器出问题了。
有一个问题需要约定一下,凡是自定义的脚本建议放到/usr/local/sbin/目录下,这样做
的目的是,一来可以更好的管理文档;二来以后接管你的管理员都知道自定义脚本放在哪里,
方便维护。
【shell脚本的基本结构以及如何执行】

Shell脚本学习一

Shell脚本通常都是以.sh 为后缀名的,这个并不是说不带.sh这个脚本就不能执行,只是大
家的一个习惯而已。所以,以后你发现了.sh为后缀的文件那么它一定会是一个shell脚本了。
test.sh中第一行一定是“#!/bin/bash” 它代表的意思是,该文件使用的是bash语法。如果
不设置该行,那么你的shell脚本就不能被执行。’#’表示注释,在前面讲过的。后面跟一些
该脚本的相关注释内容以及作者和创建日期或者版本等等。当然这些注释并非必须的,如果
你懒的很,可以省略掉,但是笔者不建议省略。因为随着你工作时间的增加,你写的shell
脚本也会越来越多,如果有一天你回头查看你写的某个脚本时,很有可能忘记该脚本是用来
干什么的以及什么时候写的。所以写上注释是有必要的。另外系统管理员并非你一个,如果
是其他管理员查看你的脚本,他看不懂岂不是很郁闷。该脚本再往下面则为要运行的命令了。

Shell脚本学习一

Shell脚本的执行很简单,直接”sh filename“ 即可,另外你还可以这样执行

Shell脚本学习一

默认我们用vim编辑的文档是不带有执行权限的,所以需要加一个执行权限,那样就可以直
接使用’./filename’ 执行这个脚本了。另外使用sh命令去执行一个shell脚本的时候是可以加
-x选项来查看这个脚本执行过程的,这样有利于我们调试这个脚本哪里出了问题。

Shell脚本学习一

默认我们用vim编辑的文档是不带有执行权限的,所以需要加一个执行权限,那样就可以直
接使用’./filename’ 执行这个脚本了。另外使用sh命令去执行一个shell脚本的时候是可以加
-x选项来查看这个脚本执行过程的,这样有利于我们调试这个脚本哪里出了问题。

Shell脚本学习一

该shell脚本中用到了’date’这个命令,它的作用就是用来打印当前系统的时间。其实在shell
脚本中date使用率非常高。有几个选项笔者常常在shell脚本中用到:

Shell脚本学习一

%Y表示年,%m表示月,%d表示日期,%H表示小时,%M表示分钟,%S表示秒

Shell脚本学习一

注意%y和%Y的区别。

Shell脚本学习一

-d 选项也是经常要用到的,它可以打印n天前或者n天后的日期,当然也可以打印n个月/
年前或者后的日期。

Shell脚本学习一

另外星期几也是常用的

Shell脚本学习一

 

【shell脚本中的变量】
在shell脚本中使用变量显得我们的脚本更加专业更像是一门语言,开个玩笑,变量的
作用当然不是为了专业。如果你写了一个长达1000行的shell脚本,并且脚本中出现了某一
个命令或者路径几百次。突然你觉得路径不对想换一下,那岂不是要更改几百次?你固然可
以使用批量替换的命令,但是也是很麻烦,并且脚本显得臃肿了很多。变量的作用就是用来
解决这个问题的。

Shell脚本学习一

在test2.sh中使用到了反引号,你是否还记得它的作用?’d’和’d1’在脚本中作为变量出现,
定义变量的格式为“变量名=变量的值”。当在脚本中引用变量时需要加上’$’符号,这跟前面
讲的在shell中自定义变量是一致的。下面看看脚本执行结果吧

Shell脚本学习一

下面我们用shell计算两个数的和。

Shell脚本学习一

数学计算要用’[]’括起来并且外头要带一个’$’。脚本结果为:

Shell脚本学习一

Shell脚本还可以和用户交互。

Shell脚本学习一

这就用到了read命令了,它可以从标准输入获得变量的值,后跟变量名。”read x”表示x
变量的值需要用户通过键盘输入得到。脚本执行过程如下:

Shell脚本学习一

在test4.sh中还有更加简洁的方式。

Shell脚本学习一

read-p 选项类似echo的作用。执行如下

Shell脚本学习一

你有没有用过这样的命令”/etc/init.d/iptablesrestart“ 前面的/etc/init.d/iptables 文件其
实就是一个shell脚本,为什么后面可以跟一个”restart”?这里就涉及到了shell脚本的预设
变量。实际上,shell脚本在执行的时候后边是可以跟变量的,而且还可以跟多个。不妨笔
者写一个脚本,你就会明白了。

Shell脚本学习一

执行过程如下:

Shell脚本学习一

在脚本中,你会不会奇怪,哪里来的$1和$2,这其实就是shell脚本的预设变量,其中$1的
值就是在执行的时候输入的1,而$2的值就是执行的时候输入的$2,当然一个shell脚本的
预设变量是没有限制的,这回你明白了吧。另外还有一个$0,不过它代表的是脚本本身的名
字。不妨把脚本修改一下。

Shell脚本学习一

转载于:https://my.oschina.net/jiaozg/blog/93674