第三十一课 Shell脚本

20.1shell脚本介绍

shell是一种脚本语言

可以使用逻辑判断、循环等语法

可以自定义函数

shell是系统命令的集合

shell脚本可以实现自动化运维,能打打增加我们的运维效率

20.2 shell脚本结构和执行

1.开头需要加#!/bin/bash,告诉系统该脚本是要以bin/bash文件解释器执行 2.以#开头的行作为解释说明 3.脚本的名字以.sh结尾,用于区分这是一个shell脚本 4。执行方法有两种 chmod +x 1.sh; ./1.sh bash 1.sh 5.查看脚本执行过程 bash -x 1.sh 6.查看脚本是否语法错误 bash -n 1.sh

20.3 date命令用法

很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作。延时通常用于脚本执行过程中提供一段等待的时间。日期可以以多种格式去打印,也可以使用命令设置固定的格式。在类UNIX系统中,日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。 date命令是显示或设置系统时间与日期。

date    //显示当前时区的当前时间
Fri Sep 15 06:08:45 CST 2017

语法

date(选项)(参数)

选项

-d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号; 
-s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号; 
-u:显示GMT; 
–help:在线帮助; 
–version:显示版本信息。

参数

<+时间日期格式>:指定显示时使用的日期时间格式。

用法

- date  +%Y-%m-%d, date +%y-%m-%d 年月日
- date  +%H:%M:%S = date +%T 时间
- date +%s  时间戳
- date -d @1504620492
- date -d "+1day"  一天后
- date -d "-1 day"  一天前
- date -d "-1 month" 一月前
- date -d "-1 min"  一分钟前
- date +%w, date +%W 星期

例子

查看系统日历

[root@host ~]#cal
  September 2017  
Su Mo Tu We Th Fr Sa
                1  2
3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

显示年份

[root@host ~]# date +%Y   //以四位数显示年份
2017
[root@host ~]# date +%y   //以两位数显示年份
17

分别显示:年、月、日、时、分、秒、星期

[root@host ~]# date "+%Y-%m-%d %H:%M:%S %w"
2017-09-15 06:15:44 5

显示年月日

[root@host ~]# date +%D
09/15/17
[root@host ~]# date +%Y%m%d
20170915
[root@host ~]# date +%F
2017-09-15

其他时间显示

[root@host ~]# date +%h    //显示现在的月份
Sep
[root@host ~]# date +%W   //显示今年的第几周
37
[root@host ~]# date +%T   //显示当前时间几点几分几秒
06:21:34
[root@host ~]# date +%s   //显示时间戳,表示距离 从1970年1月1日00:00:00到现在 经历的秒数
1505427580

时间戳换算

[root@host ~]# date +%s -d "2017-09-15 12:00:00"
1505448000
[root@host ~]# date -d @1505448000
Fri Sep 15 12:00:00 CST 2017

打印指定日期&时间

工作中,有时候需要使用N天前的日期或时间 格式是date -d "1 day" +%d

[root@host ~]# date +%F             //今天的日期
2017-09-15
[root@host ~]# date -d "-2 day" +%d   //两天前多少号
13
[root@host ~]# date -d "1 day ago" +"%Y-%m-%d"    (=date -d "1 day ago" +%F)   //1天前的日期
2017-09-14
[root@host ~]# date -d "-1 year -1 month -1 day" +%Y-%m-%d    //前一年一个月一天的日期
2016-08-14

20.4 shell脚本中的变量

当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替
使用条件语句时,常使用变量 if [ $a -gt 1 ]; then … ; fi
引用某个命令的结果时,用变量替代 n=wc -l 1.txt
写和用户交互的脚本时,变量也是必不可少的 read -p “Input a number: ” n; echo n如果没写这个n,可以直接使用n如果没写这个n,可以直接使用REPLY
内置变量 0,0,1, 2…2…0表示脚本本身,1第一个参数,1第一个参数,2 第二个 …. $#表示参数个数
数学运算a=1;b=2; c=((((a+b))或者b))或者[a+a+b]

20.5 shell脚本中的逻辑判断

3种写法:

if......;then.......;fi

if.....;then......else....fi

if.....then.....elif.....else..fi

逻辑判断表达式

-ne —比较两个参数是否不相等
-lt —小于
-le —小于等于
-gt —大于

-ge —大于等于

-eq  等于

&&并且      ||或者    ---- if 【 】 &&【】;then   结合判断

20.6 文件目录属性判断

1.[ -d file ] 判断是否是目录,且存在
2.[ -f file ]判断是否是普通文件,且存在
3.[ -e file ] 判断文件或目录是否存在
4.[ -r file ] 判断文件是否可读
5.[ -w file ] 判断文件是否可写
6.[ -x file ] 判断文件是否可执行

20.7 if特殊用法

if [ -z "$a" ]  这个表示当变量a的值为空时会怎么样
if [ -n "$a" ] 表示当变量a的值不为空
if grep -q '123' 1.txt; then  表示如果1.txt中含有'123'的行时会怎么样
if [ ! -e file ]; then 表示文件不存在时会怎么样
if (($a<1)); then …等同于 if [ $a -lt 1 ]; then…
[ ] 中不能使用<,>,==,!=,>=,<=这样的符号

20.8/20.9 case判断

格式:在case程序中,可以再条件中使用 | ,表示或的意思

case 变量名  in

                value1)                        ---第一个判断

                        command

                            ;;

                value2)                        ---第二个判断

                          command

                            ;;

                *)                                 --除此之外

                          command

                            ;;

                           esac

示例:

#!/bin/bash
read -p "Please input a number: " n        ---让用户输入数字,返回值为n
if [ -z "$n" ]                                                --返回的n值进行判断
then                                                            
    echo "Please input a number."                --提示请输入值
    exit 1                                                        --当用户运行完脚本运行echo$? 的时候会返回1
fi


n1=`echo $n|sed 's/[0-9]//g'`                        --输出是否为纯数字,如果是数字,则清空,赋值给$n1,

if [ -n "$n1" ]                                                    --判断$n1是否为空(即$n1不是纯数字),

then
 echo "Please input a number."                    --为空再次提示输入数字
 exit 1                                                              --退出
fi

if [ $n -lt 60 ]&& [ $n -ge 0 ]                             ---当数值小于60 且大于等于0  提示tag1
then
    tag=1
elif [ $n -ge 60 ] && [ $n -lt 80 ]   ---当数值大于等于60并且小于80    提示tag2
then
    tag=2
elif [ $n -ge 80 ]  && [ $n -lt 90 ]        ---当数值大于等于80且小于90   提示tag3
then
    tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ]        ---当数值大于等于90且小于100 提示tag4
then
    tag=4
else                                                       ---如果不符合上述条件则tag=0
    tag=0
fi
case $tag in                                    --当你的tag值为1/2/3/4、的时候执行如下
    1)
echo "not ok"                    ---tag1提示not ok 
        ;;
    2)
        echo "ok"                            --tag2提示 ok
        ;;
    3)
        echo "ook"                             -tag3提示 ook
        ;;
    4)
        echo "oook"                            ---tag4提示 oook
        ;;
    *)                                                --除此之外的执行tag=0
        echo "The number range is 0-100."                --提示重新输入数值范围为0-100
        ;; 
esac

20.10 for循环

格式:

for  变量名  in 条件

do

command

done

示例:把1-5的数字相加

#!/bin/bash
number=0                ---设置number变量=0
for i in `seq 1 5`            ---设置i变量序列为1-5
do    
          number=$[$number+$i]        --再次让number赋值等于  number+i的值
done
echo $number                    显示总数

示例:用在查找目录

#!/bin/bash
cd /etc/                --进入到目录

for a in `ls /etc/`            --设置变量a为 ls /etc/

do
   if [ -d $a ]            判断如果$a目录存在的话
then
   ls -d $a                ---显示出来
   fi
done

20.11/20.12 while循环

语法格式

while  条件;

do

command

done

示例;查看系统负载

#!/bin/bash
while :
do
    load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1`        --设置变量load
    if [ $load -gt 10 ]                            --如果负载大于0
    then
        /usr/bin/sbin/mail.py xxx@qq.com "$load" "报警“     --发送邮件给用户(这里可以自己写一个发送邮件脚本)
    fi
    sleep 30                        --30秒后再次检查

done

20.13 break跳出循环

#!/bin/bash
for i in `seq 1 4`            --变量
do
echo $i
if [ $i -eq 3 ]                    --当i等于3
then
    break                        --跳出循环
fi
done
echo abcs

20.14 continue结束本次循环

#!/bin/bash
for i in `seq 1 4`
do
echo $i
if [ $i -eq 3 ]
then
continue
fi
echo $i
done

echo abcs

20.15 exit退出整个脚本

#!/bin/bash
for i in `seq 1 5`
do
    echo $i
    if [ $i == 3 ]
    then
        exit
    fi
    echo $i
done

echo aaaaaaa

扩展

select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值