Shell编程、date、变量、逻辑判断、文件目录属性判断、if特殊用法、case判断、for循环、while循环、break跳出循环、continue结束本次循环、exit退出整个脚本...

 

20.1 shell脚本介绍
20.2 shell脚本结构和执行
20.3 date命令用法
20.4 shell脚本中的变量
20.5 shell脚本中的逻辑判断
20.6 文件目录属性判断
20.7 if特殊用法
20.8/20.9 case判断
20.10 for循环
20.11/20.12 while循环
20.13 break跳出循环
20.14 continue结束本次循环
20.15 exit退出整个脚本

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

 

 

 

一、shell脚本介绍

  • shell是一种脚本语言 和传统的开发语言比较,会比较简单

  • shell有自己的语法规则;可以使用逻辑判断、循环等语法

  • 可以自定义函数,目的就是为了减少重复的代码

  • shell是系统命令的集合

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

二、shell脚本结构和执行

shell脚本的格式:

开头需要加#!/bin/bash
以#开头的行作为解释说明  
脚本的名字以.sh结尾,用于区分这是一个shell脚本

示例中执行脚本会先输出123,在w查看系统负载,接着ls

b12a275553cd01e362683b0efe5c35daeb4.jpg

执行脚本的方法:

1、sh 01.sh

e4473eaab202e3987e2f2ae66c692f2aa3a.jpg

2、给脚本文件增加可执行权限,也可以执行

chmod a+x 01.sh
./01.sh         //当前目录下01.sh,相对路径
或者用绝对路径: /root/shell/01.sh

6c6c3b376280dc5631799b909d9d50649e9.jpg

3、/bin/sh实际是bash的软连接;其实是真正执行的是bash

/bin/sh 01.sh
 bash 01.sh

6f1db2f4e6680937dc7e87f3e0b90701e76.jpg

-x 查看脚本执行过程  bash -x 01.sh

716b275e98d5b60b90f282dd2ca7eb0e23a.jpg

-n查看脚本是否语法错误  bash -n 01.sh ,没有输出代表没有错误

去掉01.sh中的echo "123"的一个双引号,执行报错

d837255ca6155dbe0354eb50eaa06870714.jpg

三、date命令用法

常用格式

  • 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 星期

date //当前的日期
cal //日历
date +%Y //大写Y 年份2018
date +%y //小写y 年份18
date +%m //小写m 月份07
date +%Y%m%d //年月日20180729
date +%F //大写F 日期格式2018-07-30
date +%H //大写H 小时09
date +%M //大写M 分钟17
date +%S //大写S 秒14
date +%s //小写s 时间戳1532913453
date +%T //大写T 常规时间09:17:53
date "+%Y-%m-%d %H:%M:%S %w" //全部时间列出 年月日 时分秒 星期

053193df41118d31ef96511582e0fe12905.jpg

date -d "-1 day" //前一天的日期时间2018年 07月 28日 星期六 09:19:12 CST
date -d "-1 day" +%F //带格式的 前一天的日期时间2018-07-29
date -d "-1 month" +%F // 带格式的 上一个月2018-06-29
date -d "-1 year" +%F //带格式的 上一个月2017-07-29
date -d "-1 hour" +%T //上一小时的时间08:19:54
date +%s -d "2019-06-14 21:24:08" //查看其对应的时间戳1560518648
date -d @1560518648    把时间戳换算成日期

55e1a7a3cd1e458b116c9f9462e65991d47.jpg

四、shell脚本中的变量

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

五、shell脚本中的逻辑判断

格式1:if 条件 ; then 语句; fi  
格式2:if 条件; then 语句; else 语句; fi  
格式3:if …; then … ;elif …; then …; else …; fi
逻辑判断表达式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意到处都是空格

可以使用 && || 结合多个条件

if [ $a -gt 5 ] && [ $a -lt 10 ]; then   &&并且
if [ $b -gt 5 ] || [ $b -lt 3 ]; then      ||或者

符号

释义

对应单词

-gt

大于

greater than

-lt

小于

ess than

-ge

大于或等于

greater than or equal

-le

小于或等于

less than or equal

-eq

等于

equality

-ne

不等于

inequality

格式1:if 条件 ; then 语句; fi  

if [ $a -gt 3 ]; then echo ok; fi   如果a>3,那么输出ok

6748c14595d72159f62ae1107bbb9d1409d.jpg

放到脚本中:

afc6bfae8eba89a186f520bda3af90dc845.jpg

格式2:if 条件; then 语句; else 语句; fi  

如果$a大于3,输出ok,否则输出no

c374e94b6215b9ecfc70b9c649d6a159f03.jpg

格式3:if …; then … ;elif …; then …; else …; fi

#!/bin/bash
read -p "请输入考试分数:" a
if [ $a -lt 60 ]
then
echo "太差劲了!重考,未通过考试!"
elif [ $a -ge 60 ] && [ $a -le 85 ]
then
echo "还行吧!通过考试,成绩良好!"
else
echo "恭喜你!通过考试,成绩优秀! "
fi

f04c43d04203363f9e97143a2822dc1c9ef.jpg

 六、文件目录属性判断

  • [ -f file ]判断是否是普通文件,且存在

  • [ -d file ] 判断是否是目录,且存在

  • [ -e file ] 判断文件或目录是否存在

  • [ -r file ] 判断文件是否可读

  • [ -w file ] 判断文件是否可写

  • [ -x file ] 判断文件是否可执行

 判断是否是普通文件,且存在: [ -f file ]

示例中判断/tmp/下的tobe文件是否存在,如果存在,输出/tmp/tobe exist,不存在则创建该目录

cc40c70db2a218cf2919fc7901ac3732121.jpg

判断是否是目录,且存在: [ -d file ]

如果/tmp下的tobe123不是目录,mkdir创建,否则输出/tmp/tobe123 exist

953cf27c761b12703d6243d6f4addc1db2b.jpg

并且 &&

f="/root/ceshi"
[ -f $f ] && rm -f $f //前一条命令执行成功才会继续执行之后的命令

等同于下面的表达方式
if [ -f $f ]
then
rm -rf $f
fi

或者 ||

f="/tmp/ttt123.txt"
[ -f $f ] || touch $f //前面命令不成功时,即文件不存在,才会执行后面的命令,进行创建

等同于下面的表达方式

if [ ! -f $f ] // “!”表示了如果这条命令不成功,就往下执行
then
touch $f
fi

七、if 特殊用法

  • if [ -z "$a" ] 表示当变量a的值为空时会怎么样  
  • if [ -n "$a" ] 表示当变量a的值不为空会怎么样 
  • if grep -q 'q' /root/1.txt; then   表示如果/root/1.txt中含有'q'的行时会怎么样

圆括号与方括号的区别:

  • if (($a<1)); then … 等同于 if [ $a -lt 1 ]; then…

  • [ ] 中不能使用<,>,==,!=,>=,<=这样的符号

#! /bin/bash
n=`wc -l /etc/passwd |awk '{print $1}'` //输出/etc/passwd的行数
if [ -z "$n" ] //条件:是否为空
then
echo error
exit
elif [ $n -gt 20 ] //条件:n是否大于20
then
echo OK
fi

016dfc245d37974df0e9cfd281a9cc80959.jpg

if [ -n "$a" ] 表示当变量a的值不为空,或者说这个文件内容不为空

-n 判断变量的时候,需要用""双引号引起来,若是文件的时候,则不需要用双引号引起来

if [ -n "$b" ]; then echo $b; else echo "b is null"; fi    如果$b不为空,输出$b,否则输出b is null

35457979961281fc24057cecfa2f7a51c8d.jpg

-w精准匹配
-q 过滤,但是不显示过滤内容

if grep -wq 'user1' /etc/passwd;then echo "user1 is exist";fi   如果匹配到user1时,输出user1 is exist
if ! grep -wq 'user1' /etc/passwd;then useradd user1;fi    如果匹配不到user1,则添加用户user1

ed3e5610784d6ba4751641c785da299a12e.jpg

八、case 判断

格式:

case 变量名 in
value1)
command
;;
value2)
command
;;
*)
commond
;;
esac

案例

read -p "Please input a number: " n //read让用户输入字符串,比如输入了1,那么n就会赋值1,即n=1

448a678ac1070a53b44473af6b495197260.jpg

exit 1

5734f562e6aa207eb912313eee7d973c324.jpg

#!/bin/bash
read -p "Please input a number: " n                //read让用户输入字符串,比如输入了1,那么n就会赋值1,即n=1
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 aa number."
 exit 1
fi

if [ $n -lt 60 ] && [ $n -ge 0 ]            //经过如上的筛选,我们来判断输入数字属于哪个范围,并且把值交给tag
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            //大于100的情况
fi
case $tag in            //根据如上得到的值,进行判断
 1)                表示第一个条件
 echo "not ok"            值为1时,输出此内容
;;
 2)
 echo "ok"                值为2时,输出此内容
;;
 3)
 echo "ok ok"
;;
 4)
echo "perfect"
;;
 *)                * 代表除此之外的
 echo "Pls input a number range 0-100"
;;
esac

九、for循环

重复执行一系列命令在 编程中很常见。通常你需要重复一组命令直到达到某个特定条件,比如处理某个目录下的所有文件、系统上的所有用户或者是某个文本文件中的所有行。

常见的两种循环,在脚本中普遍被用到。

  • for循环

  • while循环

语法:for 变量名 in 条件; do …; done

示例一:累加求和

可以看到运算过程

#!/bin/bash
sum=0
for i in `seq 1 10`
do
   echo "$sum + $i"
   sum=$[$sum+$i]
   echo $sum
done
echo $sum

直接计算

#!/bin/bash
sum=0
for i in `seq 1 10`
do
   sum=$[$sum+$i]
done
echo $sum

9c000503b0080e96aaecb705f1ba3f6bbce.jpg9595cb7a137aa3aa80bb6481d6252084b1d.jpg

案例2

遍历一个目录或者文件

#!/bin/bashcd
cd /etc/        //进入到目录
for a in `ls /etc/`     //遍历此目录
do
[ -d $a ] && ls $a    # 判断是否是目录,并列出其下文件和子目录
if [ -d $a ]
then
echo $a
ls $a
fi
done

for循环会以空格或回车为分隔符

a1ae6038471be5e09f0e49d6fcefb2cf5ef.jpg

十、 while循环

语法 while 条件; do … ; done

  • 案例1:

每隔1分钟检查一下系统负载,当系统的负载大于10的时候,发一封邮件(监控脚本) 最小单元是任务计划 cron

#!/bin/bash
while :    # 冒号 : 表示死循环的意思,或者1,或者 true都是死循环
do
load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1`
if [ $load -gt 10 ]
then
/usr/lib/zabbix/alertscripts/mail.py foutt7777@163.com "load high" "$load"
fi
sleep 30 #休眠30秒,因为检查系统负载,不需要一直去检查,过一会再看
done

代码名词释义

  • w :查看系统负载 ;

  • uptime 可以直接显示 w 系统负载的第一行,就可以省去 head -1

  • head -1 //取第一行

  • awk -F 'load average: ' '{print $2}' // 以'load average: '分隔,输出第二段

  • cut -d . -f1 // 以 . 分隔 取第一段

休眠30秒后会一直检查

321608544d12e41035bf5c5b482094f2352.jpg

while循环案例2

在循环过程过,需要用户输入一个数字;输入的不是数字或输入为空;回应相应的结果

#!/bin/bash
while :
do
read -p "Please input a number: " n
if [ -z "$n" ]                如果内容是空的,那么$n为空;如果有内容,执行下面的n1=`echo $n|sed 's/[0-9]//g'`
then
echo "需要输入."                那么echo
continue                        continue 重新回到循环,继续执行上面的操作
fi
n1=`echo $n|sed 's/[0-9]//g'`    判断是否是纯数字
if [ -n "$n1" ]                ! -z = -n
then
echo "你只能输入一个纯数字."
continue
fi
break                break 退出循环
done
echo $n

6e050467e4495a461abe1dff0871da49546.jpg

十一、break跳出循环

break 常用于循环语句中,跳出整个循环语句,直接结束所有循环。

#!/bin/bash
for i in `seq 1 5`
do
echo A=$i
if [ $i -eq 3 ]    #比较数字,用-eq ;若是比较的是字符串,那需要用 ==
then
break    等于3时,调出循环
fi
echo B=$i
done
echo C=$i

ec32fd6fc92f565592569bbba4636e55e91.jpg

十二、continue结束本次循环

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

注意没有B=3行

c1b2e32413a14808beaf5ab299048a0ea34.jpg

十三、exit退出整个脚本

exit可以定义退出的数值,可以用于确定脚本运行到什么地方的时候结束

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

直接从A=3退出

708984183d3bb3d60fa52269b215c9c1f8a.jpg

转载于:https://my.oschina.net/u/4093217/blog/3062296

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值