shell-if判断

sehll 介绍:

shell 是一个命令解释器,用来翻译用户输入的指令给内核,内核驱动硬件,硬件将结果返回给内核,内核打印到屏幕
sehll 脚本:
(1)将系统命令堆积起来,顺序执行
(2)特定格式+特定语法+系统命令=脚本

shell 脚本编写规范:

  1. 开头加#!/bin/bash 作用:告诉脚本使用哪种命令解释器
  2. 附带作者及版权信息
  3. 编写的脚本放在固定目录下
  4. 脚本的扩展以.sh 结尾
  5. 脚本中尽量不要使用中文
  6. 成对的符号一次书写完成
  7. 循环格式一次性输入完成

exit 、break、continue 三者区别 在此篇:https://www.jianshu.com/p/496c9d9f1b88

一、变量:

1、什么使变量:就是用一个固定的字符串去表示不固定的值,便于后续引用。

2、shell 变量的定义方式:

2.1用户自定义变量:人为定义变量

生效范围:只对当前进程有效
自定义变量的命名规范:
1、建议使用大写字母、小写字母、下划线组成
2、变量名具备一定的含义
3、不能数字开头
4、非连续的字符或数字使用 单''、双""引号引起来。
单双引号的作用
单引号:#单引号,弱引用,不会解析引号中的变量
双引号:#强引用,会解析引号中的变量
如:

Cpu_load_ava_1=5
    HostName="db01"
    Address_eth0='172.16.1.10'
    Log='hello word'
[root@db01 ~]# Log='hello word'
[root@db01 ~]# echo ${Log}_good
hello word_good
[root@db01 ~]# 
2.2系统环境变量:保存的是和系统环境相关的数据

查看当前系统的环境变量:exoprt 或env
系统环境变量可以直接使用
2.2.1 自定义系统环境变量

[root@db01 ~]# export var=123
[root@db01 ~]# sh var.sh 
123
[root@db01 ~]# cat var.sh 
#!/usr/bin/bash
##################################
#Filename:   var.sh               
#Author:     xiaoxi               
#Email:      xiaoxi@qq.com        
#Date:       2019-09-22           
####################################
echo $var
[root@db01 ~]# 
2.3位置参数变量:向脚本中传递参数,变量名不能自定义,变量的作用是固定的
位置参数 作用
$n n 为数字,$1 表示出现的第一个参数$2 为第二个以此类推 ,10 以上的参数需要用大括号包含, 如${10}
2.4预定义的变量:在bash中已经定义好的,变量不能自定义,变量的作用也是固定的。
位置参数 作用
$0 这个变量表示执行的脚本本身
$* 这个变量代表命令行中所有的参数,把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区别对待
$# 这个变量代表命令行中所有参数的个数
$? 返回上一条命令的执行结果
$$ 返回当前进程的PID

-----------------------------$与$@的区别------------------------------------------
不加引号时,二者都是返回传入的参数
加了引号后,
$
把参数作为一个字符串整体(单字符串)返回
$@ 把每个参数作为一个一个的字符串进行返回

位置变量和预定义变量演示如下:

[root@db01 ~]# cat var.sh 
#!/usr/bin/bash
echo '当前脚本的名称' $0
echo '当前脚本的第一个变量' $1 
echo '当前脚本的第二个变量'$2 
echo '当前脚本的第三个变量'$3
echo '当前脚本的变量个数 '$#
echo '当前脚本的所有的变量是'$@
echo '当前脚本的所有变量个数是'$*
echo '上一条命令的执行结果是'$?
echo '此脚本执行的进程的PID是' $$
[root@db01 ~]# sh ~/var.sh aa bb cc 
当前脚本的名称 /root/var.sh
当前脚本的第一个变量 aa
当前脚本的第二个变量bb
当前脚本的第三个变量cc
当前脚本的变量个数 3
当前脚本的所有的变量是aa bb cc
当前脚本的所有变量个数是aa bb cc
上一条命令的执行结果是0
此脚本执行的进程的PID是 44107
[root@db01 ~]# 

3、变量赋值

shell 中 read的使用
read -p "请输入..." -p 后面跟描述
read -t 3 -p "请输入..." -t 后面跟超时时间

举例:

[root@db01 /server/scripts]# cat var1.sh 
#!/usr/bin/bash
###############################
#Filename:var1.sh
#Author:xiaoxi
#Email:xiaoxi@qq.com
#Date: 2019-09-22
#Version:1.1 
################################

read   -p "请输入您要备份的目录或文件:" backup #backup 是变量

read -t 10 -p "您确定要备份吗 Y|N?" action    #同样的action 也是变量 

if [ $action == "y" ] ;then

echo "--------backup start --------------"
sleep 3 
echo "-----------backup $backup done -------------"
else 
echo "--------------backup flase------------"

fi
[root@db01 /server/scripts]# 

4、变量的替换

变量 说明
${变量#匹配规则} 从头开始匹配,最短删除
${变量##匹配规则} 从头开始匹配,最长删除
${变量%匹配规则} 从尾开始匹配,最短删除
${变量%%匹配规则} 从尾开始匹配,最长删除
${变量/旧字符串/新字符串} 替换变量内的旧字符串为新字符串,只替换第一个
${变量//旧字符串/新字符串} 替换变量内的旧字符串为新字符串,全局替换

从头部开始删除

[root@db01 ~]# echo $url
www.xiaoxi.ren    
[root@db01 ~]# echo ${url#*.}
xiaoxi.ren
[root@db01 ~]# echo ${url##*.}
ren
[root@db01 ~]# 

从尾部开始删除

[root@db01 ~]# echo $url
www.xiaoxi.ren
[root@db01 ~]# echo ${url%.*}
www.xiaoxi
[root@db01 ~]# echo ${url%%.*}
www
[root@db01 ~]# 

5、 变量运算

num1 + num2 加    
num1 - num2 减
num1 * num2 乘
num1 / num2 除
num1 % num2 余

运算方法 :
expr :

[root@db01 ~]# expr 1 + 1 
2
[root@db01 ~]# 

$(()):

[root@db01 ~]# echo  $(($(date +%Y)+1))
2020
[root@db01 ~]# 

$[]:

[root@db01 ~]# echo $[1+1]
2
[root@db01 ~]# 

举例:在脚本中变量参与简单运算

#!/usr/bin/bash
read -p "请输入你要传入的第一个数字: " num1
read -p "请输入你要传入的第二个数字: " num2
echo "$num1 + $num2 = $(( $num1 + $num2 ))"
echo "$num1 - $num2 = $(( $num1 - $num2 ))"
echo "$num1 * $num2 = $(( $num1 * $num2 ))"
echo "$num1 / $num2 = $(( $num1 / $num2 ))"

统计变量的长度

[root@db01 ~]# num=111222333
[root@db01 ~]# echo ${#num}
9
[root@db01 ~]# 

二 、if 语句的

流程控制if 语句的三种格式:

if语句做条件判断的时候,中括号前后必须有空格

1、单分支if语句

if [ 判断条件 ];then
    条件;
fi

2、双分支if 语句

if [ 判断条件 ];then
    条件;
else
    条件;
fi

3、多分支if语句

if  [ 判断条件 ];then

    条件;
eilf  [ 判断条件 ];
    条件;
else  
    条件;
fi

2、流程控制语句四种比较方式

2.1 流程控制语句if文件比较

常用参数 作用 示例
-s 如果文件存在并且不为空则为真 [ -s /ect/file ]
-e 如果文件或目录存在则为真 [ -e /ect/file ]
-d 如果文件存在且为目录则为真 [ -d /ect/file ]
-f 如果文件存在且为普通文件则为真 [ -f /ect/file ]
-r 如果文件存在且可读则为真 [ -r /ect/file ]
-w 如果文件存在且可执行则为真 [ -w /ect/file ]
-x 如果文件存在且可执行则为真 [ -x /ect/file ]
2.2流程控制语句if整数比较
参数 说明 示例
-eq 等值为真 [ 1 -eq 1 ]
-ne 不等值为真 [ 1 -ne 1 ]
-gt 大于条件为真 [ 10 -gt 1]
-lt 小于条件为真 [ 10 -lt 1 ]
-ge 大于等于条件为真 [ 10 -ge 1 ]
-le 小于等于为真 [ 1 -eq 10 ]
2.3流程控制语句if字符比较
参数 说明 示例 额外示例
== 等于条件则为真 [ a==b]
!= 不相等条件为真 [ "a" != "b" ]
-z 字符串长度为0则为真 [ -z "$a"] 变量$a为空则为真
-n 字符串长度不为空则为真 [ -n "$a" ] 变量$a有内容
var1>var2 var1大于var2为真 [ var1>var2]
var1<var2 var1小于var2为真 [ var1<var2]
2.4流程控制语句if正则比较

使用正则表达式比较必须使用双中括号比较

[[ "$user" =~ ^[0-9]+$ ]]  判定变量是不是全部为数字
[[ "$user" =~ ^[a-z]+$ ]]  判断变量是不是全部是小写字母
[[ "$user" =~ ^[A-z]+$ ]]  判断变量是不是全部是大写字母
[[ "$user" =~ ^[a-Z]+$ ]]  判断变量是不是以字母开头
[[ ! "$user" =~ ^[a-Z]+$ ]] 如果$user 不是字母则为真;(!表示对条件取反)
[root@db01 ~]# user=abcD
[root@db01 ~]# [[ "$user" =~ ^[a-Z]+$ ]] ;echo $?
0

3、if 三种语句使用

3.1 单分支语句使用

[root@db01 /server/scripts]# cat if.sh 
#!/usr/bin/bash
if grep "$1" /etc/passwd;then
    echo "ok"
fi

[root@db01 /server/scripts]# 

3.2 双分支

[root@db01 /server/scripts]# cat if.sh 
#!/usr/bin/bash
if grep "$1" /etc/passwd;then
    echo "ok"
else 
    echo "err"
fi
[root@db01 /server/scripts]# 

3.3 多分支

#!/usr/bin/bash

read -p "请输入成绩: " cj

if [[ ! $cj =~ ^[0-9]+$ ]];then
    echo "请输入纯数字....."
    exit 1
fi
if [ $cj -ge 0 -a $cj -le 59 ];then
    echo "补考"
elif [ $cj -ge 60 -a $cj -le 80 ];then
    echo "良好"
else
    echo "优秀!"
fi

三、勤加练习

1.在每月第一天备份并压缩/etc目录的所有内容,存放到/root/bak目录,存放的形式

2019_04_10_etc.tar.gz,脚本名称为fileback,存放在/root的家目录下

2.编写一个脚本,使用systemctl检测服务是否运行的

1.如何判断我们服务是否是运行   systemctl status sshd
2.判断前者命令执行是否成功,成功则输出运行,失败则输出程序灭有运行

3.查看磁盘/当前使用状态,如果使用率超过80%则报警发邮件

1.怎么查看磁盘        # df -h
2.怎么提取使用率   df -h|grep "/$"|awk '{print $(NF-1)}'   echo ${disk/\%/}
3.判断,整数

4.备份mysql,手动输入你需要备份的库名称

1.提示用户手动输入库名称:read
2.如果用户输入数据库名称,则执行mysqldump命令备份
3.备份到哪,/backup/mysql

5.根据学生录入的成绩判断,学生的优劣,可以使用if单条件,和if的多条件

1-59  补考
60-80 合格
80-100 优秀

6.使用root用户清空/var/log/messages日志,并每次执行保留最近100行

1、判断必须是root     字符串判断
2、判断文件必须存在      文件判断
3、情空后需要保留最近100 tail

7.判断httpd服务是否正常启动 文件名必须是httpd_daemon.sh

8.根据不同的系统安装不同的yum源

9.安装不同版本的PHP, echo输出即可

10.查看内存/当前使用状态,如果使用率超过80%则报警发邮件

1.如何查看内存            free -m
2.如何查看内存百分比 使用的/总的*100=使用百分比  free -m|awk '/^Mem/ {print $3/$2*100}'

11.写一个创建用户的脚本,需要输入创建用户的前缀,比如oldboy,以及后缀。比如123。

read -p "请输入您要创建的用户前缀:"  user_qz

read -p "请输入您要创建用户的后缀: " user_hz

id $user_qz$user_hz &>/dev/null

if [ $? -eq 0  ];then
    echo "$user_qz$user_hz 用户已经存在"
else 

    useradd $user_qz$user_hz 
    if [ $? -eq 0 ];then
        echo "$user_qz$user_hz 用户已经创建"
    else
        echo "创建用户失败"
    fi

fi

12.备份MySQL中的所有数据库,每个库一个.sql的文件,记得排除没用的

1.如何拿到所有的库名称
2.拿到后一个一个备份

13.写一个rsync的启动和停止的脚本

1.如何启动的命令 rsync --daemon   
ps aux|grep rsync|grep -v grep
2.如何停止kill,
    pkill rsync
3.脚本名称rsync_daemon

14.case场景示例,编写一个nginx的启动和停止脚本。(不允许重复执行脚本,加锁。)

1.如何启动   /usr/sbin/nginx
2.如何停止   /usr/sbin/nginx -s stop
3.如何重载  /usr/sbin/nginx -s reload
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • 曾珍若生命的爱情 文/诺言 年少时,大抵是不知人间疾苦,看着书,幻想一些不着边际的事,尤其是对爱情!可能那时因为...
    任飛宇阅读 140评论 0 1
  • 经历生死,未必真的会学会长大。人总会在那么一瞬间有些诡异的长大,而自己却是浑然状并不知不觉着。 有时候枯燥而又无趣...
    心羽自心阅读 156评论 0 1
  • 说到理解。也许我没有做到真正的去理解他。我平时总是要求她这要求她那。他如果没有达到我的要求,我会怒吼,暴跳如雷。他...
    宝妈_362f阅读 91评论 0 0