shell脚本简略
作者:互联网
1 概述
shell脚本不管是开发还是运维,肯定都会遇到的。本文作者从脚本长啥样子来稍微阐述一下,本文对于那些熟悉linux系统命令但是没有写过脚本的人比较合适,内容上面比较简单,后面作者也会不断补充,力求将工作中使用的知识都补充进来。
2 脚本结构
2.1 头部解释器
一般脚本的第一行都会带上,但是很少有人知道是什么意思,这里先给两个例子。
需要bash解释器的脚本
#! /bin/bash
需要python解释器的脚本
#! /bin/python
或者
#! /usr/bin/python
此外还有其他的一些类型,可以从/etc/shells里查到其他的解释器。其中最常用的几种是: Bourne shell (sh)、C shell (csh) 和 Korn shell (ksh), 各有优缺点。Bourne shell 是 UNIX 最初使用的 shell,并且在每种 UNIX 上都可以使用, 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。Linux 操作系统缺省的 shell 是Bourne Again shell,它是 Bourne shell 的扩展,简称 Bash,与 Bourne shell 完全向后兼容,并且在Bourne shell 的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多 C shell 和 Korn shell 中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。
/bin/sh
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
应该说, /bin/sh 与 /bin/bash 虽然大体上没什么区别, 但仍存在不同的标准. 标记为 “#!/bin/sh” 的脚本不应使用任何 POSIX 没有规定的特性 (如 let 等命令, 但 “#!/bin/bash” 可以). Debian 曾经采用 /bin/bash 更改 /bin/dash,目的使用更少的磁盘空间、提供较少的功能、获取更快的速度。但是后来经过 shell 脚本测试存在运行问题。因为原先在 bash shell 下可以运行的 shell script (shell 脚本),在 /bin/sh 下还是会出现一些意想不到的问题,不是100%的兼用。
2.2 脚本信息注释
这部分是脚本的作用和编写时间,包含编写的人,修改的内容等等,没有固定的格式,但是建议这部分作为脚本的,可以参考以下格式
#--------------------------------------------
# name:shell.sh
# author:xxxx
# date:2019-06-01
# description:xxxxxxx
# parameter:$0:xxx $1:xxx $2:xxx
#--------------------------------------------
##### 用户配置区 开始 #####
#
#
# 这里可以添加脚本描述信息
#
#
##### 用户配置区 结束 #####
---------------------
2.3 参数检查
为了让脚本的灵活性更强,通常会在脚本后面加入参数传递给脚本进行执行。但是建议脚本后面的参数不要超过三个。脚本后面的参数依此是$1 $2 $3等等,$0是脚本本身的字符串名。但是注意为了让脚本出错概率较小,在脚本中对后面的参数个数进行检查,如限制一个参数。$#输出的是脚本后面所有的参数个数。
if [ $# -ne 1 ];then
echo -e "Usage: ./vacuumgp.sh < dbname > \n "
echo -e "Example : ./vacuumgp.sh postgres"
exit 8
fi
2.4 变量申明
2.4.1 脚本路径
为了体现脚本的良好移植性,不管脚本在什么目录下,都能够正确执行不报错,那么文件的路径就很重要,因为一般来说,脚本同时会输出日志等信息,可能还会调用其他同目录的脚本,就需要得到脚本的一个当前目录的变量,用于程序主体调用。
mypath=$(cd `dirname $0`;pwd)
cd "${mypath}"
2.4.2 时间
获取今天的日期
`date '+%Y%m%d %H:%M:%S'` 或 `date +%F` 或 $(date '+%Y%m%d %H:%M:%S')
定义文件名
filename="`date +%y%m%d`_etc.tar.gz"
详细的时间域如下:
格式 | 详细 |
---|---|
%H | 小时(00..23) |
%I | 小时(01..12) |
%k | 小时(0..23) |
%l | 小时(1..12) |
%M | 分(00..59) |
%p | 显示出AM或PM |
%r | 时间(hh:mm:ss AM或PM),12小时 |
%s | 从1970年1月1日00:00:00到目前经历的秒数 |
%S | 秒(00..59) |
%T | 时间(24小时制)(hh:mm:ss) |
%X | 显示时间的格式(%H:%M:%S) |
%Z | 时区 日期域 |
%a | 星期几的简称( Sun..Sat) |
%A | 星期几的全称( Sunday..Saturday) |
%b | 月的简称(Jan..Dec) |
%B | 月的全称(January..December) |
%c | 日期和时间( Mon Nov 8 14:12:46 CST 1999) |
%d | 一个月的第几天(01..31) |
%D | 日期(mm/dd/yy) |
%h | 和%b选项相同 |
%j | 一年的第几天(001..366) |
%m | 月(01..12) |
%w | 一个星期的第几天(0代表星期天) |
%W | 一年的第几个星期(00..53,星期一为第一天) |
%x | 显示日期的格式(mm/dd/yy) |
%y | 年的最后两个数字( 1999则是99) |
%Y | 年(例如:1970,1996等) |
2.4.3 数组
bash shell只支持一维的数组,使用()来定义,元素之间用空格分开。如
table_list=["table1" "table2" "table3"]
获取数组带下标即可
table_list[0]
获取所有的
table_list[*]
或者
table_list[@]
2.5 脚本主体
2.5.1 单引号、倒引号和双引号的区别
脚本主体中包含了很多的内容,除了逻辑结构,还有大量的命令结构,比如将脚本中执行linux命令结果字符串传入到变量,在脚本中输出格式化字符串等等。最常用的就是下面的三个了。
` :如果被倒引号括起来,表示里面执行的是命令。
“” :如果被双引号括起来,里面出现$(表示取变量名),`表示执行命令,\表示转义,其余的才表示字符串。
'' :如果被单引号括起来,里面表示的全部是字符串。
2.5.2 for循环
关于循环,日常作者使用比较多的就是遍历数组中的元素,对数组中的元素逐个进行操作。下面仅列出一个小例子。
for table in $tables
do
vacuumdb --analyze --table $table $database
echo "table $table has finished vacuum.">>/tmp/pg_vacuum.log
done
2.5.3 条件语句
if条件语句在进行逻辑判断时非常有用,上面涉及到的关于参数个数的检查就是一个非常简单的判断逻辑,这里不再举那个例子,而是下面这一个生产脚本的一部分,这个例子功能是检查目标文件夹是否存在输入日期的文件夹,如果存在则往下执行,如果不存在则创建。
read -p "Please input the Date(eg.20180717):" data_date
if [ ! -d /data1/backnginx/remote/$IP/${data_date:0:4}/${data_date:0:6} ];
then
echo "The target folder is not exist,creating..."
mkdir -p /data1/backnginx/remote/$IP/${data_date:0:4}/${data_date:0:6}
echo "Target folder is created!"
fi
此外还有case多分支的条件语句,目前还没有太复杂的脚本来涉及到这种分支结构,但是对于大型的脚本,涉及到对用户的多次输入进行判断的时候,就需要使用该结构,以后出现了再补充。坚持以例子来说明。
2.5.4 函数
函数的一个好处就是可以重复调用,但是一般来说,代码中完成的功能比较简单和单一,但是对于一些较大的脚本来说,函数是必不可少的。
下面举一个非常贱的函数例子,功能是计算所有参数的和。
#!/bin/bash
function getsum(){
local sum=0
for n in $@
do
((sum+=n))
done
return $sum
}
getsum 10 20 55 15 #调用函数并传递参数
echo $?
注:$@表示函数的所有参数,$?表示函数的退出状态(返回值)
3 其他
3.1 计划任务cron
一般来说,脚本是为了完成某个任务而制定的,但是很多情况下,脚本是需要进行定时执行的,因此,需要学会怎么使用crontab命令了。
crontab -l #查看当前用户的配置了哪些计划任务
crontab -e #进入编辑模式
介绍一下格式
* * * * * command
分钟 小时 号 月 星期 命令
(0~59) (0~23) (1-31) (1~12) (0~6) 脚本
例子:
0 * * * * /home/gpadmin/test.sh #每小时0分执行一次
0,30 * * * * /home/gpadmin/test.sh #每小时0分和30分各执行一次
* * * * * command # 每分钟执行一次
3,15 8-11 * * * command # 在上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * command #每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 command # 每个星期一的上午8点到11点的第3和第15分钟执行
30 21 * * * /etc/init.d/smb restart # 每晚的21:30重启smb
45 4 1,10,22 * * /etc/init.d/smb restart # 每月1、10、22日的4 : 45重启smb
10 1 * * 6,0 /etc/init.d/smb restart # 每周六、周日的1 : 10重启smb
0,30 18-23 * * * /etc/init.d/smb restart # 每天18 : 00至23 : 00之间每隔30分钟重启smb
0 23 * * 6 /etc/init.d/smb restart # 每星期六的晚上11 : 00 pm重启smb
3.2 后记
本文只是涉及到很少的内容,但是基本上是常用的。如果要把所有的shell编程都写下来,都可以成一本书了,随笔的好处就是把自己想到的都写下来,希望对自己或者其他人有帮助,而且是日积月累的过程。除了shell脚本,还有python脚本,python脚本比shell脚本更好学,支持的功能更多,尤其是在处理字符串和复杂的功能上面,python脚本简直能够秒杀shell脚本。但是python功能强大也是依赖很多包,如果linux没有自带话,安装也是依赖于外网,公司很多内网机器并不能联网,而且移植性也并没有shell那么好。总之,shell脚本能够很方便管理日常大部分的小工作,尤其是定时执行的小工作,如果后面有添加的话,作者也会及时更新在这篇随笔中。
标签:脚本,bin,shell,..,简略,sh,date 来源: https://www.cnblogs.com/easonbook/p/10951632.html