0615----Shell(一)

任务:

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脚本

shell脚本执行方式

sh 脚本名 如:sh 1.sh 或者 /bin/bash 1.sh
绝对路径 如: /root/shell/1.sh 注:需要给脚本文件添加执行权限
如果是当前文件夹下可以使用相对路径,如 ./1.sh 注:需要给脚本文件添加执行权限

sh的参数

sh -x 脚本名称 查看脚本执行过程
sh -n 脚本名称 检查脚本中的语法错误

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 -d选项用法
 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 "2017-07-29 09:17:53" //查看其对应的时间戳1501291073

在这里插入图片描述

shell脚本中的变量

当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替(比如a=jdjjdjdddx)
使用条件语句时,常使用变量 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]

if命令的格式:
格式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(!=) 注意到处都是空格

逻辑判断符号:
符号释义
-gt    大于                 greater than
-lt     小于                 less than
-ge   大于或等于      greater than or equal
-le    小于或等于      less than or equal
-eq   等于                 equality
-ne   不等于              inequality
可以使用 && || 结合多个条件

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

#!/bin/bash
a=2
if [ $a -lt 5 ] //变量a小于5的时候,输出OK
then
echo ok
fi

在这里插入图片描述
格式2:if 条件; then 语句; else 语句; fi

#!/bin/bash
a=2
if [ $a -lt 1 ]
then
echo ok
else
echo not ok
fi

在这里插入图片描述
格式3:if …; then … ;elif …; then …; else …; fi

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

在这里插入图片描述

文件目录属性判断

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

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

#! /bin/bash
f="/root/ceshi"
if [ -f $f ]
then
echo $f exist
else
touch $f
fi

在这里插入图片描述
判断是否是目录,且存在: [ -d file ]

#!/bin/bash
f='/root/ceshi'
if [ -d $f ]
then
echo  "目录已存在"
else
mkdir $f
echo "创建目录"$f
fi

在这里插入图片描述

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…
[ ] 中不能使用<,>,==,!=,>=,<=这样的符号

常见的一些用法注意:
if -z或者if -n 都不能作用在文件上,只能作用在变量上。
if [ -z "$a" ] 这个表示当变量a的值为空时会怎么样
! -z=-n
! -n=-z

case 判断

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

脚本案例

#!/bin/bash
while :
do
read -p "Please input a number: " n
if [ -z "$n" ]
then
echo "Please input a number."
continue
fi

n1=`echo $n|sed 's/[0-9]//g'`
if [ -n "$n1" ]
then
echo "Please just input a number, without any other words."
continue
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 "you didn't pass the exam!"
exit
;;
2)
echo "good!"
exit
;;
3)
echo "very good!"
exit
;;
4)
echo "perfect!!!"
exit
;;
*)
echo "Pls input a number range 0-100."
continue
;;
esac
done

在这里插入图片描述

for循环

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

for循环演示:
累加求和

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

在这里插入图片描述
遍历一个目录的子目录或者文件

#!/bin/bash
cd /root/shell
for a in `ls /root/shell`
#遍历此目录
do
if [ -e $a ]
then
echo $a
fi
done

在这里插入图片描述

while循环

语法 while 条件; do … ; done
案例:
每隔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
echo "发邮件报警"
#/usr/local/sbin/mail.py [email protected]"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 // 以 . 分隔 取第一段

break(跳出循环)、continue(结束本次循环)、exit(退出整个脚本)

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

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

continue,忽略continue之下的代码,直接进行下一次循环

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

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

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43945846/article/details/92411846