shell脚本并不能作为正式的编程语言,因为它是在linux的shell中运行的,所以称为shell脚本。事实上,shell脚本就是一些命令的集合。
假如完成某个需求需要一口气输入10条命令,对于简单的命令,我们可以直接在shell窗口中输入,但如果是比较长且复杂的命令,一次一次敲就会显得很麻烦。我们可以把这10条命令都记录到一个文档中,然后去调用文档中的命令,这样就能一步操作完成,以后再遇到这个需求的时候也只需要调用这个文档就行了,这个文档就是shell脚本,只是这个文档有它特殊的格式。
shell脚本能帮我们很方便地管理服务器,我们可以指定一个任务计划,定时去执行某个shell脚本以满足需求。在正式编写shell脚本之前,建议将所有自定义的脚本放到 /usr/local/sbin/ 目录下,一是可以更好地管理文档,二是方便后面的维护。
下面来编写第一个脚本:
[root@localhost ~]# cd /usr/local/sbin/ [root@localhost sbin]# vim first.sh //写入下面内容 #! /bin/bash ## This is my first shell script. date echo "Hello World!"shell脚本通常都以.sh作为后缀名,不是说不加.sh的脚本不能运行,只是大家的习惯,这样也方便辨识。
上面,第一行要以#!/bin/bash开头,表示该文件使用的是bash语法,不设置该行也可以执行,但不符合规范。#表示注释,后面跟一些该脚本的相关注释内容,以及作者、创建日期或版本等。注释可以省略,但不建议省略,因为我们的记忆力有限,没有注释我们自己都不知道自己写的脚本是用来干什么的、是什么时候写的。建议从一开始就要养成写脚本的良好习惯,方便自己也方便他人。
下面来执行上面的脚本:
[root@localhost sbin]# sh first.sh //用sh命令来执行 2018年 07月 27日 星期五 09:42:54 CST Hello World!还有一种执行方式:
[root@localhost sbin]# ./first.sh //用./来执行,./表示当前目录 -bash: ./first.sh: 权限不够 [root@localhost sbin]# chmod +x first.sh //给执行权限 [root@localhost sbin]# ./first.sh 2018年 07月 27日 星期五 09:44:09 CST Hello World!使用上面方法来执行shell脚本的前提是脚本本身有执行权限,所以需要给脚本加一个x权限
另外,使用sh命令来执行脚本时,可以加-x选项来查看脚本的执行过程:
[root@localhost sbin]# sh -x first.sh + date 2018年 07月 27日 星期五 09:49:22 CST + echo 'Hello World!' Hello World!上面有使用date命令,这个命令在shell脚本中使用很频繁,最常见的几个用法如下:
date +%Y :表示以四位数字格式打印年份 date +%y :表示以两位数字格式打印年份 date +%m :表示月份 date +%d :表示日期 date +%H :表示小时 date +%M :表示分钟 date +%S :表示秒 date +%w :表示星期,0~6,0表示星期天
[root@localhost sbin]# date //显示当前时间 2018年 07月 27日 星期五 09:56:08 CST [root@localhost sbin]# date +"%Y-%m-%d %H:%M:%S" //数字格式显示 2018-07-27 10:02:08参数说明:
-d datestr : 显示 datestr 中所设定的时间 (非系统时间) –help : 显示辅助讯息 -s datestr : 将系统时间设为 datestr 中所设定的时间 -u : 显示目前的格林威治时间 –version : 显示版本编号
有时,在脚本中会用到一天前的日期:
[root@localhost sbin]# date -d "-1 day" +%d //-d设定时间,-1 day 表示当前日期前1天,可以以此类推 26一小时前:
[root@localhost sbin]# date -d "-1 hour" +%H //-1 hour表示当前时间前1小时,可以以此类推 09一分钟前:
[root@localhost sbin]# date -d "-1 min" +%M -1 min表示当前时间前1分钟,可以以此类推 09格式 case 变量名 in value1) command ;; value2) command ;; *) commond ;; esac 在case程序中,可以在条件中使用|,表示或的意思, 比如 2|3) command ;;
案例:
#!/bin/bash read -p "Please input a number: " n if [ -z "$n" ] then echo "Please input a number." exit 1 fi n1=`echo $n|sed 's/[0-9]//g'` if [ -n "$n1" ] then echo "Please input a number." exit 1 fi if [ $n -lt 60 ] && [ $n -ge 0 ] then tag=1 elif [ $n -ge 60 ] && [ $n -lt 80 ] then tag=2 elif [ $n -ge 80 ] && [ $n -lt 90 ] then tag=3 elif [ $n -ge 90 ] && [ $n -le 100 ] then tag=4 else tag=0 fi案例二
case $tag in 1) echo "not ok" ;; 2) echo "ok" ;; 3) echo "ook" ;; 4) echo "oook" ;; *) echo "The number range is 0-100." ;; esac文件列表循环
#!/bin/bash cd /etc/ for a in `ls /etc/` do if [ -d $a ] then ls -d $a fi done语法 while 条件; do … ; done 案例1
#!/bin/bash while : do load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1` if [ $load -gt 10 ] then top|mail -s "load is high: $load" asldkfls@11.com fi sleep 30 done案例二:
#!/bin/bash while : do read -p "Please input a number: " n if [ -z "$n" ] then echo "you need input sth." continue fi n1=`echo $n|sed 's/[0-9]//g'` if [ -n "$n1" ] then echo "you just only input numbers." continue fi break done echo $n忽略continue之下的代码,直接进行下一次循环
#!/bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then continue fi echo $i done echo $ishell中的select用法