shell脚本简介
shell脚本首先是一个脚本,并不是真正的编程语言,他只能运行在linux的shell中,所以叫shell脚本。说白了shell脚本就是一些命令的集合。
比如,想要实现以下的操作:
1. 进入/tmp/目录
2. 列出当前目录中所有文件名
3. 把所有当前的文件拷贝到/root/目录下
4. 删除当前目录下的所有文件
这四部操作需要在shell窗口中敲4次命令,如果是更加复杂的几十次操作,一次次的敲键盘会很麻烦。所以不妨把所有的操作记录到一个文档中,然后调用文档中的命令,这样一步操作就可以完成,这个文档就是shell脚本,当然这个shell脚本有它特殊的格式。
shell脚本能帮助我们很方便的去管理服务器,我们可以制定一个计划任务去执行一个shell脚本实现我们的需求。在正式写shell脚本之前,有一个建议,凡是自定义的脚本都放到/usr/local/sbin/下,这样做的目的是,一来可以更好地管理文档,二来以后接管你的管理员都知道自定义的脚本放在哪里,方便维护。
shell结构以及执行
下面我们来写第一个shell脚本:
cd/usr/local/sbin
vimfirst.sh
加入以下内容:
#!/bin/bash
date
echo"Hello world"
shell脚本通常都是以.sh为后缀名的。shell的第一行一定要以#!/bin/bash开头,表名该文件使用的是bash语法。
用sh命令运行脚本:
sh first.sh
可以加上-x选项查看这个脚本的执行过程,这样有利于我们调试这个脚本哪里有问题
sh -x first.sh
还可以这样运行:
chmod a+x first.sh
./first.sh (相对路径)
/usr/local/sbin/first.sh (绝对路径)
date命令
date命令在shell脚本中使用非常频繁
直接用date可以显示当前的时间
查看日历用cal命令,加上-y可以查看整年的日历
date的几个用法:
1. 输出四位的年、月、日,格式2016-05-31
date +%Y-%m-%d
2. 输出两位的年、月、日,格式16-05-31
date +%y-%m-%d
3. 另一种输出年月日的方式
date +%F
4. 输出时间,格式10:52:15
date +%H:%M:%S
5. 另一种输出时间的方式
date +%T
6. 时间戳
date +%s
返回的值是现在距离1970-1-10:0:0一共有多少秒
7. 根据时间戳反向推测时间
date -d @ 1464692090
8. 一天后
date -d "+1day"
9. 一天前
date -d "-1day"
10. 一个月前
date -d "-1month"
11. 一分钟前
date -d "-1min"
12. 星期
date +%w
date +%W
小写w表示周几,大写W表示本年的第几周
13. 手动调整时间
date -s "2016-05-31 11:03:45"
14. 自动调整时间
yum install –y ntp
ntpdate [时间服务器]
例如:ntpdate ntp.windows.com
ntpdatentp.fudan.edu.cn
shell自定义变量
当一个路径在脚本中出现多次,你想修改这个路径时就需要修改很多次,很麻烦,并且脚本显得不简洁。变量的作用就是来解决这个问题的。
变量定义很简单,[变量名]=[值]等号的两边不能有空格
变量的使用也很简单,只要在变量名前加上$符号即可
vim 123.sh
#!/bin/bash
d=`date +%H:%M:%S`
echo "One : $d"
echo "Now sleep 2s"
sleep 2
d1=` date +%H:%M:%S `
echo "Two : $d"
数学运算
在shell中也是经常会用到数学运算的,变量需要用[ ]括起来
vim jia.sh
#!/bin/bash
a=1
b=2
sum=$[$a+$b]
echo "$a+$b=$sum"
vim cheng.sh
#!/bin/bash
a=3
b=2
c=$[$a*$b]
echo "$c"
vim chu.sh
a=10
b=3
c=$[$a/$b]
echo "$c"
在除法的运算中,结果为3并不是一个小数,这是应为shell默认是不支持小数的。我们需要小数时怎么做呢,这就需要借助bc,bc是linux系统里面的计算器,如果没有先安装一下yum install –y bc
echo "scale=2;10/3"|bc
和用户交互
shell脚本可以实现让用户去输入变量的值
vim read.sh
#!/bin/bash
read -p "input a number:" x
read -p "input another number:"y
sum=$[$x+$y]
echo "sum=$sum"
当然也可以给read加上超时限制,超过指定时间没有输入值就会自动退出,加上-t
read -t 10 -p "input a number:"x
shell脚本预设变量
有时我们会用到这样的命令/etc/init.d/iptablesrestart前边的/etc/init.d/iptables就是一个shell脚本,为什么后面可以跟一个restart?这里就涉及到shell脚本的预设变量。实际上,shell脚本在执行的时候后边可以跟参数的,而且还可以是多个。
shell脚本预设的变量有0、1、2、3,其中0是脚本的名字,运行脚本时后边跟的参数分别对应变量1、2、3。
vim 456.sh
#!/bin/bash
echo "\$0=$0"
echo "\$1=$1"
echo "\$2=$2"
echo "\$3=$3"
sh 465.sh 1 2 3
执行结果:
$0=456.sh
$1=1
$2=2
$3=3
编辑回复