shell多分支与case语句和循环

语法介绍

 # 单if语法
 '适用范围:只需要一步判断,条件返回真干什么'
 ​
 ## 案例
 if [ condition ]           # condition 值为true or false
    then                    # 条件为真的时候执行
       commands             # 代码块 一行或者多行代码
 fi                         # 语句的结束
  
 ## 翻译
 假如  条件为真
 那么
     执行commands代码块
 结束
 ​
 ​
 # if…else语句
 '适用范围==:两步判断,条件为真干什么,条件为假干什么'
 ​
 ## 案例
 if [ condition ]     
      then                   # 条件为真
           commands1         # 真  要执行代码块
      else                   # 条件为假
           commands2         # 假   要执行的代码块
 fi                          # 结束
 ​
 ## 翻译
 假如条件为真
 那么
         执行commands1代码块
 否则
         执行commands2代码块
 结束
 ​
 ​
 # if…elif…else语句
 '适用范围:多于两个以上的判断结果,也就是多于一个以上的判断条件'
 ​
 ## 案例
 if [ condition1 ]; then
     # 如果 condition1 为真,执行这里,然后跳过所有 elif 和 else
     command1
 elif [ condition2 ]; then
     # 只有 condition1 为假时,才会检查 condition2
     # 如果 condition2 为真,执行这里,然后跳过 else
     command2
 else
     # 只有所有条件都为假时,才会执行这里
     commandX
 fi
 ​
 ​
 ## 翻译
 假如 条件1 为真
       那么
              执行代码块1
 假如 条件2 为真
       那么
             执行代码块2
       以此类推的N个条件及对应的执行代码块
 否则 【以上所有条件中没有一个满足的】
             执行代码块X
 结束
 ​
 ​
 # if嵌套if
 '当有多步判断的时候,可以使用if嵌套'
 ​
 ## 案例
 if [ $1 -ne $2 ]
    then
        if [ $1 -gt $2 ]
           then
           echo " $1 > $2 "
           else
           echo " $1 < $2 "
           fi
     else
        echo " $1 = $2 "
 fi
 ​
 ​
 # if高级用法
 ## 案例1
 '条件符号使用双圆括号,可以在条件中植入数学表达式 if (())'
 if (( (5+5-5)*5/5 > 10 ))
     then
         echo "yes"
     else
         echo "no"
 fi
 ​
 ## 案例2
 '使用双方括号,可以在条件中使用通配符'
 for var in  ab ac rx bx rvv vt
    do
        if [[ "$var" == r* ]]
       then
         echo "$var"
        fi
 done
 ​
 ​
 # 简写if
 ## 案例1
 if [ ! -d /tmp/baism ]
     then
         mkdir /tmp/baism
 fi
 ​
 ## 可以简写为
 [ ! -d /tmp/baism ] && mkdir /tmp/baism
 ​
 ## 案例2
 if [ $USER == 'root' ]
       then
           echo "hello root"
       else
           echo "hello guest"
 fi
 ​
 ## 可以简写为
 [ $USER == 'root' ]&&echo "hello root" || echo "hello guest"

if-elif-else(并列关系)

多个条件是互斥的,只执行第一个满足的,然后退出。

if嵌套if(层级关系)

多个条件是递进的,外层条件满足后,才检查内层条件。内外层都满足才会执行内层代码。

条件循环语句-case

case介绍

特点:根据给予的不同条件执行不同的代码块

 # 介绍
 # 执行完匹配的分支后,跳到 esac 后面继续执行
 case $var in
 pattern 1)
     # 如果 $var 匹配 pattern1,执行这里,然后跳出
     command1
     ;;                    # 两个分号表示退出这个分支
 pattern 2)
     # 只有 pattern1 不匹配时,才会检查 pattern2
     # 如果匹配,执行这里,然后跳出
     command2
     ;;
 pattern 3)
     # 只有 pattern1、pattern2 都不匹配时,才会检查 pattern3
     command3
     ;;
 *)
     # 所有模式都不匹配时,执行默认分支
     command4
     ;;
 esac
 ​
 ​
 # 案例1
 case $1 in
     1)
         echo "安某人被捕了"
     2)
         echo "胡某人被捕了" 
     3)
         echo "苗某人被捕了"
     *)
         echo "陈某人跑了" 
 esac
 ​
 ​
 # 案例2(加入循环)循环输出直到选择退出【加上最后一行的done】
 while true;do       
 cat << EOF
     1.系统内存
     2.显示ip
     3.显示磁盘
     4.退出
 EOF
 read -p "请输入选项:" CH
 case $CH in
     1) free -h ;;
     2) ip a    ;;
     3) df -h   ;;
     4) break   ;;
     *) echo "选择错误";;
 esac
 done

for 循环

 # 基本语法
 {开始..结束}              # 步长默认为1
 {开始..结束..步长}        # 指定步长
 {开始..结束..-步长}       # 递减
 ​
 # 数值示例
 for i in {1..10}; do          # 1 2 3 4 5 6 7 8 9 10
 for i in {1..10..2}; do       # 1 3 5 7 9
 for i in {10..1..-1}; do      # 10 9 8 7 6 5 4 3 2 1
 for i in {10..1..-2}; do      # 10 8 6 4 2
 ​
 # 字母示例
 for i in {a..z}; do           # a b c ... z
 for i in {a..z..3}; do        # a d g j m p s v y
 for i in {z..a..-1}; do       # z y x ... a
 ​
 # for语法
 # 遍历列表
 for i in 1 2 3 4 5
 do
     echo $i
 done
 ​
 # 遍历数组
 arr=(a b c d e)
 for i in "${arr[@]}"
 do
     echo $i
 done
 ​
 # 遍历文件
 for file in *.txt
 do
     echo "$file"
 done

while 循环

介绍:条件为真会进行下一次循环,条件为假,自动退出循环;

 # \n 换行
 # \t 制表 table
 # \r 回车(光标移动到一行的开头)
 ​
 # true   真
 # false  假
 ​
 # break     直接结束整个循环
 # continue  跳过本次,继续下一次
 ​
 ​
 # 案例1
 while true
 do
     echo -e "$(date + '%H:%M:%S')\r"
     sleep 1
 done
 ​
 # 案例2(ping通循环)
 while ping -c1 www.baidu.com &> /dev/null
 do
     echo "有网"
     sleep 5
 done
 ​
 # 案例3(ping不通一直循环)
 until ping -c1 www.baidu.com &> /dev/null
 do  echo "等待网络"
     sleep 1
 done