shell脚本
首先它是一个脚本,并不能作为正式的编程语言。因为是跑在linux的shell中,所以叫shell脚本。说白了,shell脚本就是一些命令的集合。举个例子,我想实现这样的操作:
- 进入到/tmp/目录;
- 列出当前目录中所有的文件名;
- 把所有当前的文件拷贝到/root/目录下;
- 删除当前目录下所有的文件。
简单的4步在shell窗口中需要你敲4次命令,按4次回车。这样是不是很麻烦?当然这4步操作非常简单,如果是更加复杂的命令设置需要几十次操作呢?那样的话一次一次敲键盘会很麻烦。所以不妨把所有的操作都记录到一个文档中,然后去调用文档中的命令,这样一步操作就可以完成。其实这个文档呢就是shell脚本了,只是这个shell脚本有它特殊的格式。
Shell脚本能帮助我们很方便的去管理服务器,因为我们可以指定一个任务计划定时去执行某一个shell脚本实现我们想要需求。这对于linux系统管理员来说是一件非常值得自豪的事情。现在的139邮箱很好用,发邮件的同时还可以发一条邮件通知的短信给用户,利用这点,我们就可以在我们的linux服务器上部署监控的shell脚本,比如网卡流量有异常了或者服务器web服务器停止了就可以发一封邮件给管理员,同时发送给管理员一个报警短信这样可以让我们及时的知道服务器出问题了。
一个问题需要约定一下,凡是自定义的脚本建议放到**/usr/local/sbin/**目录下,这样做的目的是,一来可以更好的管理文档;二来以后接管你的管理员都知道自定义脚本放在哪里,方便维护。
shell脚本的基本结构以及如何执行
cd /usr/local/sbin
sudo vim test.sh
在test.sh中编写:
#! /bin/bash
## This is my first shell script.
## Writen by aming 2019-08-08.
date
echo "Hello World."
Shell脚本通常都是以.sh 为后缀名的,这个并不是说不带.sh这个脚本就不能执行,只是大家的一个习惯而已。
test.sh中第一行一定是 “#! /bin/bash” ,它代表的意思是,该文件使用的是bash语法。如果不设置该行,那么你的shell脚本就不能被执行。
运行:
sh test.sh
还可以这样运行:
sudo chmod +x test.sh
./test.sh
用vim编辑的文档默认是不带有执行权限的,所以需要加一个执行权限,那样就可以直接使用’./filename’ 执行这个脚本了。另外使用sh命令去执行一个shell脚本的时候是可以加-x选项来查看这个脚本执行过程的,这样有利于我们调试这个脚本哪里出了问题。
sh -x test.sh
该shell脚本中用到了’date’这个命令,它的作用就是用来打印当前系统的时间。其实在shell脚本中date使用率非常高。有几个选项笔者常常在shell脚本中用到:
date "+%Y%m%d %H:%M:%S"
-d 选项也是经常要用到的,它可以打印n天前或者n天后的日期,当然也可以打印n个月/年前或者后的日期。
date -d "-1 month" "+%Y%m%d"
date -d "-1 year" "+%Y%m%d"
date -d "+1 day" "+%Y%m%d"
shell脚本中的变量
如果你写了一个长达1000行的shell脚本,并且脚本中出现了某一个命令或者路径几百次。突然你觉得路径不对想换一下,那岂不是要更改几百次?你固然可以使用批量替换的命令,但是也是很麻烦,并且脚本显得臃肿了很多。变量的作用就是用来解决这个问题的。
date (可以不用双引号" ")
变量后面的等号左右两边不能有空格。
sudo vim test2.sh
#! /bin/bash
## In this script we will use variables.
## Writen by aming 2019-08-08.
d=`date +%H:%M:%S`
echo "the script begin at $d"
echo "now we will sleep 2 seconds."
sleep 2
d1=`date "+%H:%M:%S"`
echo "the script end at $d1"
当在脚本中引用变量时需要加上’$’符号。
用shell计算两个数的和
sudo vim test3.sh
#! /bin/bash
# Shell script - test3.sh
# For get two numbers' sum
# aming 2019-08-08.
a=1
b=2
sum=$[$a+$b]
echo "sum is $sum"
数学计算要用’[ ]’括起来并且外头要带一个’$’。
Shell脚本和用户交互
sudo vim test4.sh
#! /bin/bash
# Shell script test4.sh
# Using "read" in the script
# Aming 2019-08-08.
echo "Please input a number:"
read x
read -p "Please input another number:" y
sum=$[$x+$y]
echo "The sum of two number is: $sum."
read命令,它可以从标准输入获得变量的值,后跟变量名。”read x”表示x变量的值需要用户通过键盘输入得到。
read -p 选项类似echo的作用。
预设变量
你有没有用过这样的命令”/etc/init.d/iptables restart “ 前面的/etc/init.d/iptables 文件其实就是一个shell脚本,为什么后面可以跟一个”restart”? 这里就涉及到了shell脚本的预设变量。实际上,shell脚本在执行的时候后边是可以跟变量的,而且还可以跟多个。
sudo vim test5.sh
#! /bin/bash
# test5.sh
# aming 2019-08-08
echo "$0 $1 $2"
执行:
/usr/local/sbin$ sh test5.sh 23 34
test5.sh 23 34
在脚本中,哪里来的$1和$2,这其实就是shell脚本的预设变量,其中$1的值就是在执行的时候输入的23,而$2的值就是执行的时候输入的34,当然一个shell脚本的预设变量是没有限制的。另外还有一个$0,不过它代表的是脚本本身的名字。