美文网首页
Shell编程之if流程控制语句

Shell编程之if流程控制语句

作者: 你好树洞先生 | 来源:发表于2019-12-19 17:06 被阅读0次

(接上篇的序号)

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

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

相关文章

  • Shell流程控制

    Shell流程控制 简单流程控制语句 单分支if语句 语法格式 双分支if语句 语法格式 多分支if语句 语法格式...

  • Shell编程之if流程控制语句

    (接上篇的序号) 8.read 示例: read示例语法,测试用户输入的IP是否通 1.执行脚本时,提示:请...

  • # shell流程控制语句

    shell流程控制语句 任何编程语言都离不开流程控制语句,其实编程基本上就是掌握了流程控制语句,然后加上函数(或者...

  • 工具篇-shell脚本编程快速入门(over)

    参考:《shell脚本-菜鸟教程》 1 流程控制语句 1.1 if语句 语法1(if)if conditionth...

  • Shell编程之case流程控制语句

    Shell之case语句 1.case 用来实现对程序流程的选择、循环等进行控制。 语法: case 变量 in ...

  • shell编程之特殊流程控制语句

    exit [返回值] 如果 exit 命令之后定义了返回值,那么这个脚本执行之后的返回值就是我们自己定义的返回值。...

  • linux shell 流程控制语句

    linux shell 有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语...

  • Shell编程、part3

    本节内容 1. shell流程控制2. for语句3. while语句4. break和continue语句5. ...

  • shell流程控制语句

    壹:>按文件类型进行判断 。 参数说明 -e 文件名如果文件存在则为真 -r 文件名...

  • JavaScript-流程控制语句

    一、if流程控制语句 二、switch流程控制语句 三、流程控制语句

网友评论

      本文标题:Shell编程之if流程控制语句

      本文链接:https://www.haomeiwen.com/subject/jsfvnctx.html