Shell-逻辑结构

#一、if 判断
###1. if … then … fi

单层
如果 是真的 那么 …

if [ 条件判断式 ];then
    当条件判断式成立时,可以进行的命令。
fi   # 结束这个判断语句结构

示例:
提示输入一个整数,程序判断输入的值是否大于 18

风格1
#!/usr/bin/env sh

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

if [ "$num" -gt 18 ];then
    echo "你输入的数值大于 18"
fi


风格2
#!/usr/bin/env sh

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

if [ "$num" -gt 18 ]
then
    echo "你输入的数值大于 18"
fi

###2. if … then … else…fi

多重、复杂条件判断式
如果 是真的 那么 … 否则 …

一颗红心,两手准备

if [ 条件判断式 ]; then
    当条件判断式成立时,可以进行的指令工作内容;
else
    当条件判断式不成立时,可以进行的指令工作内容;
fi

示例:
判断用户输出的字符串
输入 y
就输出文本内容 “script is running…”
否则输出文本内容 “STOP”

风格1
#!/usr/bin/env sh
echo "Press y to continue"
read yn
# read -p "Press y to continue" yn
if [ "$yn" = "y" ];then
    echo "script is running..."
else
    echo "STOP!"
fi


风格2
#!/usr/bin/env sh
read -p "Press y to continue:" yn
if [ "$yn" = "y" ];then
    echo "script is running..."
else
    echo "STOP!"
fi

###3. if … elif … elif … else … fi

多个条件判断 (if … elif … elif … else) 分多种不同情况执行

if [ 条件判断式一 ]; then
    当条件判断式一成立时,可以进行的指令工作内容;
elif [ 条件判断式二 ]; then
    当条件判断式二成立时,可以进行的指令工作内容;
else
    当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi

注意
elif 也是个判断式,因此出现 elif 后面都要接 then 来处理!但是 else 已经是最后的没有成立的结果了, 所以 else 后面并没有 then

示例:
通过判断输入的整数,判断是什么常用服务

#!/usr/bin/env sh
read -p "请输入一个常用的服务默认端口号:"  port

if [ "$port" -eq 80 ];then
    echo "HTTP 服务"
elif [ "$port" -eq 3306 ];then
    echo "Mysql 服务"
elif [ "$port"  -eq  21 ] || [ "$port"  -eq  20 ];then
    echo "FTP 服务"
elif [ "$port" -eq 22 ];then
    echo "SSHD 服务"
elif [ "$port"  -eq 23 ];then
    echo "Telnet 服务"
else
   echo "未知服务"
fi

####在判断中支持正则
使用双中括号 [[ ]]

匹配 使用 =~
比如: [[ “$val” =~ [a-z]+ ]]
=~ 表示 匹配
[a-z+] 是正表达式,不需要用任何引号,用了引号就会被识别为普通字符串

不匹配 使用 !
比如: [[ ! “$val” =~ [0-9]+ ]]

示例:

#!/usr/bin/env   sh
name=chen

if [[ "$name"  =~  [a-z]+ ]];then
   echo "ok"
fi


if [[ ! "$name" =~ [0-9]+ ]];then
   echo  "good"
fi

####嵌套

#!/usr/bin/env sh
read -p "请输入一个常用的服务默认端口号:"  port

if [[ "$port" =~ [0-9]+ ]];then

    if [ "$port" -eq 80 ];then
        echo "HTTP 服务"
    elif [ "$port" -eq 3306 ];then
        echo "Mysql 服务"
    elif [ "$port"  -eq  21 ] || [ "$port"  -eq  20 ];then
        echo "FTP 服务"
    elif [ "$port" -eq 22 ];then
        echo "SSHD 服务"
    elif [ "$port"  -eq 23 ];then
        echo "Telnet 服务"
    else
       echo "未知服务"
    fi
else
    echo "nmber"
fi

#二、 利用 case … esac 判断
基本语法

case  $变量名称 in       <==关键字为 case ,还有变量前有钱字号
  "第一个变量的值")       <==每个变量内容建议用双引号括起来,关键字则为小括号 )
    程序段
    ;;                  <==每个类别结尾使用两个连续的分号来处理!
  "第二个变量的值")
    程序段
    ;;
  *)                    <==最后一个变量内容都会用 * 来代表所有其他值
    不包含第一个变量内容与第二个变量内容的其他程序运行段
    exit 1
    ;;
esac                    <==反过来写,结束当前语句结构!

示例:运维工具箱
模式还可以是多个

#!/bin/bash
cat << EOF
m|M) show memory usages;
d|D) show disk usages;
q|Q) quit
EOF
    read -p "Your choice" choice
    case $choice in
    m|M)
        free -m
        ;;
    d|D)
        df -h
        ;;
    q|Q)
        exit
        ;;
*)
        echo "Invalid input"
        ;;
esac

#三、while … do … done (不确定的循环)

while [ condition ]  ==>中括号内的状态就是判断式
do                   ==> do 是循环的开始!
    命令或者代码
    命令或者其他逻辑语句
done                 ==> done 是循环的结束

###计数
每次循环体执行完,while 都会检查条件是否为真,为真继续循环,否则终止循环。

n=0
while [ "$n" -lt 5 ]
do
   let n++
   echo "$n"
done

###读文件

while read line
do
    echo $line
done < /etc/passwd

每次循环, 都会把 /etc/passwd 中的每一个行内容 赋值给变量 line

###read

[root@localhost ~]# read id name age
1 chen 18
[root@localhost ~]# echo $age
18
[root@localhost ~]# echo $id  $name
1 chen

[root@localhost ~]# old_ifs=$IFS; IFS=','

[root@localhost ~]# read id name age
2, chao, 20
[root@localhost ~]# echo "$id| $name| $age"
2|  chao|  20
[root@localhost ~]# export IFS=$old_ifs
[root@localhost ~]# read id name age
2, chao, 20
[root@localhost ~]# echo "$id| $name| $age"
2,| chao,| 20
[root@localhost ~]# read id name age
2,chao,20
[root@localhost ~]# echo "$id| $name| $age"
2,chao,20| |

###while read

[root@localhost ~]# cat db1.sql 
1 chen 18
2 chao 20

[root@localhost ~]# cat while-read.sh 
while read id name age
do
    echo "$id | $name | $age"
done < db1.sql

[root@localhost ~]# sh while-read.sh 
1 | chen | 18
2 | chao | 20

#五、 for do done (固定的循环)

for var in con1 con2 con3 ...
do
done

var 是变量名
con1``````con2``````con3是常量,就是具体的数据
也可以是一个已经被赋值的变量, 写法 ${v1}``````${v2}

以上面的例子来说,这个 $var的变量内容在循环工作时会动态的改变:

  • 第一次循环时, $var的内容为 con1 ;
  • 第二次循环时, $var的内容为 con2 ;
  • 第三次循环时, $var的内容为 con3 ;

###for 循环中 变量的取值方式
#####1. 从一组字符串中取值

for  var     in    one    two    three   four   five 
do
    echo    "****************************"
    echo   '$var   is '    $var
done

#####2. 从位置变量中取值

for    var
do
    echo  '-----------------------------'
    echo   '$var   is '    $var
done

执行方式:sh 文件名后跟值
例:sh for-2.sh 1 2 3 4 

#####3. 从累计变化的格式中取值

#!/bin/bash 
for    ((var=1;var<=10;var++))
do
    echo   "------------------------" 
    echo   '$var   is '    $var
done

#####4. 从命令结果中取值

#!/bin/bash
for   var   in   $(cat    file.txt)                    #指令和文件路径
do
    echo  " ------------------------" 
    echo   '$var   is '    $var
done

###IFS
修改 for 循环中的分界符,默认是 空格

[root@localhost ~]# cat a.txt
hello world name age
hello world name age

[root@localhost ~]# vim ifs.sh

[root@localhost ~]# cat ifs.sh
# 先保存原来的值
old_ifs=$IFS

# 设置分界符为 回车
IFS=$'\n'
for line in $(cat a.txt)
do
  echo $line
done

# 把变量的值回复成原来的状态
export IFS=$old_ifs

#####嵌套循环

[root@localhost ~]# cat for-for.sh
for n in {1..3}
do
    for i in {a..e}
    do
        echo "外层循环的值$n--内层循环的值$i"
    done
    echo "----------------"
done

[root@localhost ~]# sh for-for.sh
外层循环的值1--内层循环的值a
外层循环的值1--内层循环的值b
外层循环的值1--内层循环的值c
外层循环的值1--内层循环的值d
外层循环的值1--内层循环的值e
----------------
外层循环的值2--内层循环的值a
外层循环的值2--内层循环的值b
外层循环的值2--内层循环的值c
外层循环的值2--内层循环的值d
外层循环的值2--内层循环的值e
----------------
外层循环的值3--内层循环的值a
外层循环的值3--内层循环的值b
外层循环的值3--内层循环的值c
外层循环的值3--内层循环的值d
外层循环的值3--内层循环的值e
----------------

#####补充:数值运算

➜  ~ n=1
➜  ~ let n++
➜  ~ echo $n
2
➜  ~ (( n++ ))
➜  ~ echo $n
3
➜  ~ a=2
➜  ~ b=3
➜  ~ let f=a+b
➜  ~ echo $n
3
➜  ~ echo $f
5
➜  ~ let f = a + b     ==> 错误
zsh: bad math expression: operand expected at `='
➜  ~ let "f = a + b"
➜  ~ echo $f
5

#六、break 和 continue

  • break 就是退出循环,循环不再继续了。假如是嵌套的循环,就是退出当前层级的循环。
  • continue 是停止本次循环体内的代码,继续进行下一次循环
    ###1. 单层循环的 break
[root@localhost ~]# cat break.sh
#! /bin/sh
for n in {1..5}
do
    if [ "$n" -eq 4 ];then
        echo "退出循环体"
        break
    fi
    echo $n
done

echo "程序已退出 $n"

[root@localhost ~]# sh break.sh
1
2
3
退出循环体
程序已退出 4

###2. 多层循环的 break

[root@localhost ~]# cat break2.sh
for n in {1..5}
do
    for i in {a..e}
    do
            echo "内层循环的值$i"
        if [ "$i" == 'd' ];then
            break
        fi
    done

    echo "外层循环的值$n--内层循环的值$i"
    echo "-------------------------------"
done

[root@localhost ~]# sh break2.sh
内层循环的值a
内层循环的值b
内层循环的值c
内层循环的值d
外层循环的值1--内层循环的值d
-------------------------------
内层循环的值a
内层循环的值b
内层循环的值c
内层循环的值d
外层循环的值2--内层循环的值d
-------------------------------
内层循环的值a
内层循环的值b
内层循环的值c
内层循环的值d
外层循环的值3--内层循环的值d
-------------------------------
内层循环的值a
内层循环的值b
内层循环的值c
内层循环的值d
外层循环的值4--内层循环的值d
-------------------------------
内层循环的值a
内层循环的值b
内层循环的值c
内层循环的值d
外层循环的值5--内层循环的值d
-------------------------------

###3. 单层循环的 continne

[root@localhost ~]# cat continue.sh
for n in {1..5}
do
    if [ "$n" -eq 2 ];then
        echo "跳出本次循环,继续下一次循环"
        continue
    fi

    echo $n
done
echo "程序已退出 $n"

[root@localhost ~]# sh continue.sh
1
跳出本次循环,继续下一次循环
3
4
5
程序已退出 5

运维工具箱
[❤ ~]# vim optools.sh 

menu(){
    clear
        echo '1) 查看菜单'
        echo '2) 查看内存信息'
        echo '3) 查看磁盘使用信息'
        echo '4) 查看防火墙状态'
        echo '5) 查看SELinux状态'
        echo '6) 查看本机IP'
        echo '7) 退出工具箱'
}

neicun(){
    clear
        echo '内存信息:'
    free -hm |awk ' NR==2 {print"总内存:"$2,"可用内存:"$7} '
}

yingpan(){
    clear
        echo '磁盘使用信息:'
    df -h |awk ' NR==2{print "总容量:"$2,"已用容量:"$3,"可用容量:"$4}'
}

fanghuoqiang(){
    clear
        echo '防火墙状态:'
    systemctl status firewalld > /dev/null
    if [ $? -eq 0 ];then
        echo '开启中'
    else
        echo '已关闭'
    fi
}

selinux(){
    clear
        echo 'SELinux状态:'
    getenforce
}

P(){
    clear
        echo 'IP:'
    hostname -I
}

    menu

while true
do
    read -p "请输入指令:" choice
    case $choice in
        1)
        menu
            ;;
        2)
        neicun
            ;;
        3)
        yingpan
            ;;
        4)
        fanghuoqiang
            ;;
        5)
        selinux
            ;;
        6)
        IP
            ;;
        7)
        clear
            echo '再见'
        exit
            ;;
        *)
        menu
            echo "无效指令"
            echo '-----------------------------------------------------------------'
            ;;
    esac
done
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值