Shell编程之if流程控制语句

(接上篇的序号)

8.read 示例:

  read示例语法,测试用户输入的IP是否通

  1.执行脚本时,提示:请输入ip

  2.使用ping命令去探测是否是通,如果通则返回存活,如果不通则返回失败。

  if [];then

      else

  fi

------------------------------------------------------------

#!/bin/bash

#1.提示用户输入一个ip地址

read -p "请输入需要检测的IP地址:" IP

#2.使用ping命令检测IP地址是否通讯

ping -W1 -c1 $ip &>/dev/null

#3.检查上一次命令执行返回状态码是否正常

if [$? -eq 0];then

    echo "$IP 能正常通信"

else

    echo "$IP 无法正常通信"

fi

----------------------------------------------------------------

[root@test shell]# sh ping1.sh

请输入需要检测的IP地址:127.0.0.1

127.0.0.1 能正常通信

请输入需要检测的IP地址:192.168.1.1

192.168.1.1 无法正常通信

========================================

升华:

使用read命令写一个脚本修改主机名和IP地址

  1.提示用户输入主机名称

  2.提示用户输入IP地址】

  3.询问用户是否输入IP地址

  4.真实的执行

代码:

#!/bin/bash

#1.提示用户输入新的主机名称,然后打印新的主机名称

read -p "请输入你想要修改的主机名称:" HostName

echo "你将要修改的主机名称为:$HostName"

#2.是否确认修改,如果确认则真的执行shell命令,如果不确认则退出

read -p "你确认真的要修改如下内容吗[Y|N]?" readly

#3.判断用户输入的是Y还是N,如果是Y则真的执行,如果是其他则退出

if [$readly == "Y"];then

    hostnamectl set-hostname $HostName

else

    exit

fi

-----------------------------------------------------------

[root@test shell]# sh read.sh

请输入你想要修改的主机名称:www.sm.com

你将要修改的主机名称为:www.sm.com

你确认真的要修改如下内容吗[Y|N]?" n

[root@test shell]# sh read.sh

请输入你想要修改的主机名称:www.sm.com

你将要修改的主机名称为:www.sm.com

你确认真的要修改如下内容吗[Y|N]?" Y

===========================================

9.Shell 变量替换:

变量                        说明

${变量#匹配规则}          从头开始匹配,最短删除

${变量##匹配规则}        从头开始匹配,最长删除

${变量%匹配规则}          从尾开始匹配,最短删除

${变量%%匹配规则}        从尾开始匹配,最长删除

${变量/旧字符串/新字符串} 替换变量内的旧字符串为新字符串,只替换一个

${变量//旧字符串/新字符串}替换变量内的旧字符串为新字符串,全部替换

eg:1.从前往后删除变量内容

[root@test shell]# url=www.sina.com.cn  #定义变量

[root@test shell]# echo ${url}          #输出变量的值

www.sina.com.cn

[root@test shell]# echo ${url#*.}    #从前往后,最短匹配

sina.com.cn

[root@test shell]# echo ${url##*.}  #从前往后,最长匹配

cn

eg:2.从后往前删除变量内容:

[root@test shell]# url=www.sina.com.cn  #定义变量

[root@test shell]# echo ${url}          #输出变量的值

www.sina.com.cn

[root@test shell]# echo ${url%*.}      #从后往前,最短匹配

www.sina.com

[root@test shell]# echo ${url%%*.}      #从后往前,最长匹配,贪婪匹配

www

-----------------------------------------------------------

eg:3.变量内容替换:

[root@test shell]# url=www.sina.com.cn    #定义变量

[root@test shell]# echo ${url/sina/baidu}   #替换sina为baidu

www.baidu.com.cn

[root@test shell]# echo ${url/n/N}             #替换第一个小n为大写N

www.siNa.com.cn

[root@test shell]# echo ${url//n/N}           #替换全部小n为大写N

www.siNa.com.cN

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

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

分析:

1.备份什么?      源  /etc

2.备份到哪?      目标 /root/bak

3.使用什么方式?  压缩 tar

4.备份的周期?    每月第一天,如何每月第一天。crond

代码:

#!/bin/bash

DestPath=/root/bak

Date=$(date +%Y_%m_%d)

Date=$(date +%Y_%m_%d)

#1.准备目标位置

[ ! -d $DestPath ] && mkdir -p $DestPath

#2.备份到目标位置

tar czf $DestPath/${Date}_etc.tar.gz /etc

[root@test shell]# crontab -l

00 23 1 * * bash /root/fileback &>/dev/null

=================================================

10.流程控制语句if基本概述

1)单分支结构

if [ 如果你有房 ];then

    我就嫁给你

fi

eg:

#!/bin/bash

if which ls;then

    echo "ok";

fi

2)多分支结构

  if [ 如果你有房 ];then

  elif [ 你有车 ];then

  elif [ 你有钱 ];then

    else

        再见

  fi

eg:

#!/bin/bash

read -p "input a user:" tu

if grep $tu /etc/passwd ;then

        echo " 用户 $tu 存在该系统"

elif ls -d /home/$tu ; then

        echo "用户 $tu 不存在该系统"

        echo "但是 $tu 用户家目录存在"

else

echo  "用户 $tu不存在该系统"

echo  "$tu 用户也不存在家目录"

fi

==========================================

案例1:场景实践,查看内存/当前使用状态,如果使用率超过80%则报警发邮件。

  1.如何查看内存          free -m

  2.如何查看内存百分比    使用的/总的*100=使用百分比

  free -m|awk '/^Mem/ {print $3/$2*100}'

代码:vi free_use.sh

#!/bin/bash

#监控内存使用百分比,超过百分之80则报警

free_use=$(free -m|awk '/^Mem/ {print $3/$2*100}')

if [ ${free_use%.*} -gt 80 ];then

    echo "你的内存超过了百分之80,当前是${free_use%.*}%"

else

    echo "你的内存正常使用,当前是${free_use%.*}%"

fi

[root@test shell]# sh free_use.sh

你的内存正常使用,当前是15%。

========================================

案例2:场景实践,在/backup下创建10个.txt的文件,找到/backup目录下所有后缀名为.txt的文件

分析:

1)批量修改txt为txt.bak                      find

2)把所有的.bak文件打包压缩为123.tar.gz      tar

3)批量还原文件的名字,及把增加的.bak再删除  find

代码:

#!/bin/bash

#1.改名

find /bakup -inname "*.txt"|sed -r 's#(.*)#mv \1.bak#g|bash'

#2.打包

tar czf /backup/123.tar.gz $(find /backup -iname "*.bak")

#3.还原

find /backup -inname "*.bak"|sed -r 's#(.*).bak#mv \1.bak \1#g'|bash

-----------------------------------------------------------

升华:

#!/bin/bash

#定义变量

T=txt

B=bak

#把backup 目录下.txt结尾的文件修改成txt.bak

cd /backup && rename $T $T\.$B *.txt

#把所有的.bak 结尾的文件打包压缩为123.tar.gz

tar zcvf /backup/123.tar.gz  /backup/*.bak

#还原文件的名字

rename $T\.$B $T *

-----------------------------------------------------------

利用for循环:

#!/bin/bash

File_txt=$(find /back/ -type f -iname ".txt"|xargs >/backup/txt.tt)

for i in $(cat /backup/txt.tt)

do

    mv $i $i.bak

done

cd /backup/

tar czf 123.tar.gz ./*.bak

File_bak=$(find /backup/ -type f -iname "*.bak" >/backup/txt.tt)

for j in $(cat /backup/tar.tt)

do

    mv $j ${j%.*}

done

==================================================================

3)流程控制语句if文件比较

if语句中的文件比较

参数                      说明                                 示例

-e        文件或目录存在则为真                    [ -e file ]

-s        文件存在且至少有一个字符则为真  [ -s file ]

-d        文件存在且为目录为真                    [ -d file ]

-f        文件存在且为普通文件则为真          [ -f file ]

-r        文件存在且可读则为真                    [ -r file ]

-w       文件存在且可写则为真                   [ -w file ]

-x        文件存在且可执行则为真                [ -x file ]

-----------------------------------------------------------

eg1:判断/etc/hosts文件是否存在

if [ -e /etc/hosts ];then  #当条件为真时,则执行then后面的代码

    echo "ok";

fi

eg2:判断/etc/hosts文件是否存在

if [ -e /etc/hosts ];then

    echo "ok"

else

  echo "err"

fi

案例3:

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

2.提示用户手动输入库名称:read

3.如果用户输入数据库名称,则执行mysqldump命令备份

4.备份到哪,/banckup/mysql

#!bin/bash

DestPath=/backup/mysql

[ -d $DestPath ] || mkdir -p $DestPath

read -p "请输入你要备份的数据库名称:" db

/usr/bin/mysqldump --single-transaction -R

-B $db > $DestPath/${db}_${date +%F}.sql

if [ $? -eq 0 ];then

        echo "-----------"

echo "$db 数据库备份成功"

echo "-----------"

fi

4)数值比较 [ 整数1 操作符 整数2 ]

参数      说明                       示例                     状态   

-eq        等于则为真          [ 1 -eq 10 ]               假

-ne        不等于则为真      [ 1 -ne 10 ]                真    条件一致为假,否则为真

-gt        大于则为真          [ 1 -gt 10 ]                  假

-lt        小于则为真           [ 1 -lt 10 ]                    真

-ge        大于等于则为真  [ 1 -gt 10 ]                  假

-le        小于等于则为真   [ 1 -le 10 ]                   真

eg:

#!/bin/bash

if [ $# -ge 1 ];then

      systemctl status $1 > /dev/null

  if[ $? -eq 0 ];then

          echo "$1 服务正在运行"

  else

echo "$1 服务暂末运行"

  fi

else

    echo "执行脚本的格式"

    echo "sh $0 服务名"

fi

--------------------------------------------------------------

案例4:

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

思路:

1. 怎么查看磁盘  #df -h

2.怎么提取使用率  df -h|grep "/$"|awk '{print ${NF-1}}' echo ${disk/\%/}

#!/bin/bash

Disk_Free=$(df -h|grep "/$"|awk '{print $5}'|awk -F '%' 'print' %1 )

if [ $Disk_Free -ge 80 ];then

    echo "Disk Is Use: ${Disk_Free}%" > /tmp/disk_use.txt

fi

--------------------------------------------------------------

案例4--升华:

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

思路:

1. 怎么查看磁盘  #df -h

2.怎么提取使用率  df -h|grep "/$"|awk '{print ${NF-1}}' echo ${disk/\%/}

3.判断,整数

#!bin/bash

disk_use=$(df -h | grep "/$"|awk '{print ${NF-1}')

if [ ${disk_use/\%} -ge 80 ];then

    echo "你的磁盘使用率过高。。。${disk_use}"

else

  echo "你的磁盘使用率正常。。。${disk_use}"

fi

--------------------------------------------------------------

5)if字符串比较

参数                 说明                                   示例

==            等于则为真                           [ "$a" == "$b"]

!=            不相等则为真                        [ "$a" != "$b"]

-z            字符串的长度为零则为真      [ -z "$a" ]

-n            字符串的长度不为空则为真  [ -n "$a" ]

str1 > str2    str1大于str2为真              [ str1 > str2 ]

str1 > str2    str1小于str2为真             [ str1 < str2]

eg:根据学生的录入成绩判断,学生的优劣:

  1-59  补考

  60-80  合格

  80-100 优秀

  1.read 读入学生输入的分数

  2.比较分数,看是否符合那条件

      小于60    补考

      等于60    合格

      高于80    优秀

[root@test shell]# cat if-2.sh

read -p "请输入你的分数:" fs

if [ $fs -lt 60 ];then

    echo "补考"

elfi [ $fs -gt 100 ];then

    echo "不老实"

elif [ $fs -ge 80 ];then

echo "优秀"

elif [ $fs -ge 60 ];then

echo "合格"

fi

----------------------------------

升华版:

根据学生的录入成绩判断,学生的优劣:

  1-59  补考

  60-80  合格

  80-100 优秀

  1.read 读入学生输入的分数

  2.比较分数,看是否符合那条件

      小于60    补考

      等于60    合格

      高于80    优秀

代码:

#!/bin/bash

read -p "请输入你的分数:" fs

if [ $fs -gt 0 -a $fs -lt 60 ];then

    echo "补考"

elif [ $fs -ge 60 -a $fs -lt 80 ]; then

    echo "合格"

elif [ $fs -ge 80 -a $fs -le 100 ];then

    echo "优秀"

else

    echo "不老实"

fi

----------------------------------------------------

升级完整版:

vi fs.sh

read -p "请输入你的分数:" fs

#判断数字

expr $fs + 1 &>/dev/null

if [ $? -ne 0 ];then

  echo "请输入数字"  && exit

fi

#判断是否为空值

if [ -z $fs ];then

  echo "不要尝试直接回车,没有用的" && exit

fi

#判断成绩

if [ $fs -gt 0 -a $fs -lt 60 ];then

  echo "补考"

elif [ $fs -ge 60 -a $fs -lt 80 ];then

  echo "合格"

elif [ $fs -ge 80 -a $fs -le 100 ];then

  echo "优秀"

else

  echo "不老实"

fi

========================================

11. if语句正则比较:

1)正则对比示例:

  #单括号无法使用正则语法

[root@test shell]# [ "$USER" =~^r ];echo $?

bash: [: =~: binary opertor expected ]

#双[]才可以使用正则匹配

[root@test shell]# [[ "$USER" =~ ^r ]];echo $?

0

--------------------------------------

案例5: 判断用户输入的是否是 数字

代码:

#!/bin/bash

read -p "请输入一个数值:" num

if [[ ! "$num" =~ ^[0-9]+$ ]];then

echo "你输入的不是数字,程序退出!!!"

exit

fi

echo "你输入的数字是 $num"

--------------------------------------------

案例6:写一个创建用户的脚本,需要输入创建用户的前缀,比如student,以及后缀。比如123。

#!/bin/bash

read -p "请输入用户的前缀:" qz

if [[ ! $qz =-^[a-Z]+$ ]];then

  echo "你输入的不是english。。。"

  exit

fi

read -p "请输入创建用户的后缀:" hz

if [[ $hz =- ^[0-9]+$ ]];then

user=${qz}${hz}

id $user &>/dev/null

if [ $? -eq 0 ];then

    echo "用户已经存在 $user"

else

    useradd $user

    echo "用户创建成功 $user"

      fi

fi

--------------------------------------------------------------

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

推荐阅读更多精彩内容