理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

前言:

單引號表示純符號 用雙引號表字符串

  • case多分支語句
  • 循環語句
    • for循環語句
    • while循環語句
    • until循環語句
  • shell函數
  • shell數組

一 : case語句的結構

1.1 case結構

  • 多分支表現形式:if語句,case語句

  • case 語句可以使用正則表達式,正則表達式後面會去闡述

  • 針對變量的不同取值,分別執行不同的命令程序

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

case 中;;表示一句話的結束

如果匹配某一個固定值,大多數用caes,其適用於某一個固定值

如果匹配某一個區間範圍,大多數用if else 語句,其適用於一個範圍

*後面 不需要加;;

1.2 case執行過程流程圖

  • case針對變量的不同取值,分別執行不同的命令序列

  • case變量匹配的是模式,if變量匹配的是條件

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

1.3 case語句應用示例

1.3.1 示例1:擊鍵類型識別

  • 提示用戶輸入一個字符
  • 判斷出該字符是字母、數字或者其他字符
#/bin/bash
read -p "請按個鍵,我可以測試年的鍵是字母數字或是其他字符" jian
case "$jian" in
[0-9])
     echo "你按的是數字"
     ;;
[a-z]|[A-Z])
     echo "你按的是字母"
     ;;
*)
     echo "你按的是特殊字符"
esac
[root@localhost opt]# sh shibiejijian.sh
請按個鍵,我可以測試年的鍵是字母數字或是其他字符8
你按的是數字
[root@localhost opt]# sh shibiejijian.sh
請按個鍵,我可以測試年的鍵是字母數字或是其他字符a
你按的是字母
[root@localhost opt]# sh shibiejijian.sh
請按個鍵,我可以測試年的鍵是字母數字或是其他字符A
你按的是字母
[root@localhost opt]# sh shibiejijian.sh
請按個鍵,我可以測試年的鍵是字母數字或是其他字符@
你按的是特殊字符

1.3.2 請輸入您的成績判斷優良合格不合格

#!/bin/bash
read -p "請輸入您的成績" cj
case "$cj" in
[0-9]|[1-5][0-9])
    echo "成績不合格"
    ;;
7[0-4]|6[0-9])
    echo "成績合格"
    ;;
7[5-9]|8[0-4])
    echo "成績良好"
    ;;
8[5-9]|9[0-9]|100)
    echo "成績優秀"
    ;;
*)
    echo "你輸入的成績有誤"
esac

[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績-1
你輸入的成績有誤
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績0
成績不合格
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績9
成績不合格
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績10
成績不合格
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績59
成績不合格
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績60
成績合格
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績74
成績合格
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績75
成績良好
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績7^H84
你輸入的成績有誤
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績84
成績良好
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績85
成績優秀
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績99
成績優秀
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績100
成績優秀
[root@localhost opt]# sh chengjicase.sh 
請輸入您的成績101
你輸入的成績有誤
[root@localhost opt]# 

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

1.3.3 示例2:編寫系統服務腳本

  • 使用start、stop、restart等參數來控制服務
  • 服務控制指令通過位置變量 $1 傳入

二 : for語句的循環結構

2.1 for語句概述

  • 讀取不同的變量值,用來逐個執行同一組命令

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

控制循環的中斷

取值列表是一個集合;

自上而下進行依次讀取賦值執行命令的操作叫做遍歷,

for可以視爲在超市進行購物車結算的掃碼槍

2.2 for語句流程圖

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

2.3 for語句應用實例

2.3.1 示例1——批量添加用戶

  • 用戶名存放在users.txt文件中,每行一個
  • 初始密碼設爲123456
  • 驗證腳本
#!/bin/bash
for ((i=1;i<=4;i++))
  do
     useradd "admin$i" &> /dev/null
     echo "123456" | passwd --stdin "admin$i" &> /dev/null
     echo "用戶admin$i創建成功"
  done
~     
[root@localhost opt]# sh users.sh
用戶admin1創建成功
用戶admin2創建成功
用戶admin3創建成功
用戶admin4創建成功

2.3.2 示例2——使用根據IP地址檢查主機狀態

  • IP地址存放在ipadds.txt文件中,每行一個
  • 使用ping命令檢測各主機的連通性

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

[root@localhost opt]# vim addr.sh 
#!/bin/bash
List=$(cat /opt/ipadds.txt)
for ((i=0;i<=256;i++))
do
   ping -c 3 -i 0.2 -W 1 192.168.10.$i &> /dev/null
     if [ $? =  0 ]
       then
        echo "192.168.10.$i is up"
     else
        echo "192.168.10.$i is down"
     fi
done

2.3.3 將1-10從上往下排列

#!/bin/bash
for ((i=1;i<=10;i++))
  do
echo "$i"
  done

for的雙分號不能拆掉

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

2.3.4: 1-100的偶數和

sum=0
for ((i=0;i<=100;i+2))
do
     let sum+=$i
done
    echo "$sum"

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

i+=2 代表i=i+2

continue 跳過自己部分的語句,重新循環

let 命令 ,重新賦值的意思,相當於在sum的基礎上,再加一個數

break 看到break後,直接退出循環

$RANDOM是隨機值

用其取餘可以固定隨機數的範圍

2.3.5 猜價格

  • 方法一
#!/bin/bash
echo  "話不多說,過來猜價格"
b=`expr $RANDOM % 1000`
n=0
read -p "輸入你心中的數,猜猜今天的優惠商品的價格(0-999)?" a
while [ $a -ne $b ]
do
   if [ $a -gt $b ]
     then
       echo "你把它想得太貴了"
read -p "輸入你心中的數,猜猜今天的優惠商品的價格(0-999)?" a
    let n++
     else
       echo "你太低估它的價格了"
     let n++
read -p "輸入你心中的數,猜猜今天的優惠商品的價格(0-999)?" a
   fi
done
   let n++
    echo "恭喜你猜對了,他的價格是$b,你一共猜了$n次可惜你沒錢買"
    exit 0
  • 方法二
#!/bin/bash
n=0
echo "這是一個猜價格的遊戲,價格在1~1000的範圍內."
jiage=$(expr $RANDOM % 1000)
while true
do
read -p "請輸入你猜的價格:" cai
if [ $cai -eq $jiage ]
  then
         let n++
         echo "恭喜你猜對了!它的價格是:$jiage.你一共猜了$n次."
         exit 0
elif [ $cai -gt $jiage ]
 then
        let n++
        echo "你猜的價格高了,猜低一點."
elif [ $cai -lt $jiage ]
 then
        let n++
        echo "你猜的價格低了,猜高一點."
fi
done

2.3.6 九九乘法表

  • 方法一
#!/bin/baash
for ((i=1;i<=9;i++))
do
  for ((a=1;a<=i;a++))
  do
      echo -n "$i x $a=$(expr $i \* $a)  " 
   if  [ $a -eq $i ]
   then
      echo -e '\n' 
   fi
  done
done
  • 方法二

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

echo 的help幫助

NAME(名稱)
       echo - 顯示一行文本

SYNOPSIS(總覽)
       echo[OPTION]... [STRING]...

DESCRIPTION(描述)
       允許在標準輸出上顯示STRING(s).

       -n 不輸出行尾的換行符.

       -e 允許對下面列出的加反斜線轉義的字符進行解釋.

       -E 禁止對在STRINGs中的那些序列進行解釋.

       --help 顯示幫助並退出(須單獨運行)

       --version 輸出版本信息並退出(須單獨運行)

       在沒有 -E 的情況下,可承認並可以內置替換以下序列:

        \NNN  字符的ASCII代碼爲NNN(八進制)

        \\    反斜線

        \a    報警符(BEL)

        \b    退格符

        \c    禁止尾隨的換行符

        \f    換頁符

        \n    換行符

        \r    回車符

        \t    水平製表符

        \v    縱向製表符
  • 菱形的九九乘法表
#!/bin/bash
for ((i=1;i<=17;i++))
do
  if [ $i -le 9 ];then
  k=$(expr 45 - $(expr $i \* 5))
     until [ $k -eq 0 ]
     do
     echo -n "     "
     let k-=5
     done
       for ((j=1;j<=i;j++))
       do
       echo -n "$i*$j=$(expr $i \* $j)    "
         if [ $i -eq $j ]
         then
         echo -e '\n'
         fi
       done
  else
  xi=$(expr 18 - $i)
  xk=$(expr 45 - $(expr $xi \* 5))
      until [ $xk -eq 0 ] 
      do
      echo -n "     "
      let xk-=5
      done
       for ((xj=1;xj<=xi;xj++))
       do
       echo -n "$xi*$xj=$(expr $xi \* $xj)    "
         if [ $xj -eq $xi ]
         then
         echo -e '\n' 
         fi
       done
  fi
done

三 : while語句的結構

3.1 while語句概述

  • 重複測試某個條件,只要條件成立則反覆執行

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

3.2 while 語句應用示例

3.2.1 逛商業街

  • 方法一
#!/bin/bash:
echo "歡迎來到商業街,走一走逛一逛"
qian=0
a=1.電腦城
b=2.服裝店
c=3.饅頭店
d=4.泳裝店
goumai=你購買了
while true
do
echo "1.電腦城"
echo "2.服裝店"
echo "3.饅頭店"
echo "4.泳裝店"
read -p "商業街上有電腦城、服裝店、饅頭店、泳裝店,你想去哪一個瞅瞅?(輸入序號)" nub
case $nub in
1)
echo “===========歡迎進入電腦城==========================”
echo "1.手機800元"
echo "2.電腦1200元"
echo "3.充電器線15元"
echo "4.鍵盤100元"
read -p "有以上商品供你選購---有你想買的東西嗎?(yes/no)" yesno
while true
do
  if [ $yesno = yes ]
  then
    read -p "輸入你想買的商品序號" xuhao
      case $xuhao in
      1)
        echo "你購買了價值800元的手機"
        let qian=800+$qian
           goumai=$goumai手機、
        ;;
      2)
        echo "你購買了價值1200元的電腦"
        qian=`expr $qian + 1200`
           goumai=$goumai手機、
        ;;
      3)
        echo "你購買了價值15元的充電線"
        qian=`expr $qian + 15`
           goumai=$goumai手機、
        ;;
      4)
        echo "你購買了價值100元的鍵盤"
        qian=`expr $qian + 100`
           goumai=$goumai手機、
        ;;
      *)
        echo "店裏沒有你想要的東西"
        break
      esac
  else
    echo "沒有想買的那我們就走"
    break
  fi
done
  ;;
2)
echo “===========歡迎進入服裝店==========================”
echo "1.鞋子120元"
echo "2.褲子85元"
echo "3.帽子15元"
echo "4.皮帶320元"
read -p "有以上商品供你選購---有你想買的東西嗎?(yes/no)" yesno
while true
do
  if [ $yesno = yes ]
  then
    read -p "輸入你想買的商品序號" xuhao
      case $xuhao in
      1)
        echo "你購買了價值120元的鞋子"
        let qian=120+$qian
           goumai=$goumai鞋子、
        ;;
      2)
        echo "你購買了價值85元的褲子"
        qian=`expr $qian + 85`
           goumai=$goumai褲子、
        ;;
      3)
        echo "你購買了價值15元的帽子"
        qian=`expr $qian + 15`
           goumai=$goumai帽子、
        ;;
      4)
        echo "你購買了價值320元的皮帶"
        qian=`expr $qian + 320`
           goumai=$goumai皮帶、
        ;;
      *)
        echo "店裏沒有你想要的東西"
        break
      esac
  else
    echo "沒有想買的那我們就走"
    break
  fi
done
  ;;
3)
echo “===========歡迎進入饅頭店==========================”
echo "1.山東雜糧大煎餅15元"
echo "2.青島大龍蝦餡兒包子15元"
echo "3.簡單的白饅頭1元"
echo "4.不簡單的白饅頭1000元"
read -p "有以上商品供你選購---有你想買的東西嗎?(yes/no)" yesno
while true
do
  if [ $yesno = yes ]
  then
    read -p "輸入你想買的商品序號" xuhao
      case $xuhao in
      1)
        echo "你購買了價值15元的山東雜糧大煎餅"
        let qian=15+$qian
           goumai=$goumai山東雜糧大煎餅、
        ;;
      2)
        echo "你購買了價值15元的青島大龍蝦餡兒包子"
        qian=`expr $qian + 15`
           goumai=$goumai青島大龍蝦包子、
        ;;
      3)
        echo "你購買了一個簡單的白饅頭"
        qian=`expr $qian + 1`
           goumai=$goumai白饅頭、
        ;;
      4)
        echo "你購買了不簡單的白饅頭,獲取了老闆娘的芳心"
        qian=`expr $qian + 1000`
           goumai=$goumai老闆娘的芳心、
        ;;
      *)
        echo "店裏沒有你想要的東西"
        break
      esac
  else
    echo "沒有想買的那我們就走"
    break
  fi
done
  ;;
4)
echo “===========歡迎進入泳裝店==========================”
  echo "1.泳帽10元"
  echo "2.泳衣15元"
  echo "3.泳鏡12元"
  echo "4.比基尼32元"
read -p "有以上商品供你選購---有你想買的東西嗎?(yes/no)" yesno
while true
do
  if [ $yesno = yes ]
  then
    read -p "輸入你想買的商品序號" xuhao
      case $xuhao in
      1)
        echo "你購買了價值10元的泳帽"
        let qian=10+$qian
           goumai=$goumai泳帽、
        ;;
      2)
        echo "你購買了價值15元的泳衣"
        qian=`expr $qian + 15`
           goumai=$goumai泳衣、
        ;;
      3)
        echo "你購買了價值12元的泳鏡"
        qian=`expr $qian + 12`
           goumai=$goumai泳鏡、
        ;;
      4)
        echo "你購買了價值32元的比基尼"
        qian=`expr $qian + 32`
           goumai=$goumai比基尼、
        ;;
      *)
        echo "店裏沒有你想要的東西"
        break
      esac
  else
    echo "沒有想買的那我們就走"
    break
  fi
done
  ;;
*)
  echo "輸入錯誤,不帶你逛街了"
  echo "你這次逛街花了$qian元,$goumai"
  exit 1
esac
done
  • 方法二
#!/bin/bash
  2 qian=0
  3 n=0
  4 echo "======歡迎來到來了一定讓你掏錢的商業街==============="
  5 
  6 for ((i=1;i<=4;i++));do
  7 echo "===========來到第$i家店============="
  8 read -p "小帥哥,來玩啊?--是否進店(yes/no)" yesno
  9   case $yesno in
 10   yes)
 11   echo "你不會後悔的,看看商品吧"
 12   echo "1.女主播穿過的絲襪300元"
 13   echo "2.買了就後悔的瓶子900元"
 14   echo "3.會動的可充電扭蛋150元"
 15   read -p "你想買哪個呢,一個一個按序號買哦"   xuhao
 16     case $xuhao in
 17     1)
 18     echo "你選擇了女主播的襪子,花了300元"
 19     let qian+=300
 20     let n++
 21     ;;
 22     2)
 23     echo "你選擇了買了就後悔的瓶子,裏面空無一物,白花了900元"
 24     let qian+=900
 25     let n++
 26     ;;
 27     3)
 28     echo "你選擇了會動的可充電扭蛋,送給女主播會有驚喜哦"
 29     let qian+=150
 30     let n++
 31     ;;
 32     *)
 33     echo "小夥子,店裏的東西還不齊全,再看看吧"
 34     esac
 35     while true
 36     do
 37     read -p "是否繼續看看(yes/no)" yesn
 38       if [ $yesn = yes ];then
 39       echo "喲吼吼,小夥子挺有錢嘛"
 40       echo "你不會後悔的,看看商品吧"
 41       echo "1.女主播穿過的絲襪300元"
 42       echo "2.買了就後悔的瓶子900元"
 43       echo "3.會動的可充電扭蛋150元"
 44       read -p "這次又要買什麼呢(請輸入序號)" xuh
 45         case $xuh in
 46         1)
 47         echo "你選擇了女主播的襪子,花了300元"
 48         let qian+=300
 49         let n++
 50         ;;
 51         2)
 52         echo "你選擇了買了就後悔的瓶子,裏面空無一物,白花了900元"
 53         let qian+=900
 54         let n++
 55         ;;
 56         3)
 57         echo "你選擇了會動的可充電扭蛋,送給女主播會有驚喜哦"
 58         let qian+=150
 59         let n++
 60         ;;
 61         *)
 62         echo "小夥子,店裏的東西還不齊全,再看看吧"
 63         esac
 64       else
 65       break
 66       fi
 67       done
 68   ;;
 69   no)
 70   echo "可惜了,歡迎再次光臨吧"
 71   ;;
 72   *)
 73   echo "小傢伙,你很皮哦,你不進來我還不讓你進呢" 
 74   esac
 75 done
 76   echo "=======購物結束,看看自己被宰了多少錢======="
 77   echo "你花了$qian元,買了$n個物品"

while true 代表死循環 ,需要在其中加入一個if語句,if語句內含break,用來退出循環

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

3.2.2 猜猜誰最幸運

  • 方法一
#!/bin.bash
n=0
c=0
b=0
for ((i=1;i<=10;i++))
do
shuzi=`expr $(expr $RANDOM % 2) + 1`
xingming=`cat /opt/jbxx/mingdan.txt | grep $shuzi | awk -F: '{print $2}'`
# cat 人員名單
     case "$shuzi" in
    1)
      let  n++
      ;;
     2)
      let  c++
      ;;
      *)
      let  b++
     esac
   echo "$xingming"
done
echo "zhangsan $n次、 lisi $c 次、 wangwu $b 次" 
  • 方法二
    理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

  • 方法三

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

3.2.3 批量添加用戶

  • 用戶名稱以stu開頭,按數字順序進行編號
  • 一共添加20個用戶,即stu1、stu2、stu3·······、stu20
  • 初始密碼設爲123456
#!/bin/bash
i=1
until [ $i -gt 20 ];do
useradd stu$i
#echo "123456" | passwd --stdin stu$i &> /dev/null
  let i++
echo "用戶stu$i創建成功"
done
===========================================================
#!/bin/bash
i=1
while [ $i -le 20 ];do
userdel -r  stu$i
#echo "123456" | passwd --stdin stu$i 
  let i++
echo "用戶stu$i刪除成功"
done

3.2.4 猜商品價格遊戲

  • 通過變量RANDOM獲得隨機數
  • 提示用戶猜測並記錄次數,猜中後退出循環
#!/bin/bash
n=1
jiage=$[RANDOM%1000+1]
read -p "請輸入你心中的價格:" cai
while [ $cai != $jiage ];do
   if [ $cai -gt $jiage ];then
   echo "你輸入的價格高了"
   let n++
read -p "請輸入你心中的價格:" cai
    else
    echo "價格低了"
   let n++
read -p "請輸入你心中的價格:" cai
   fi
done
echo "恭喜你猜中了,該商品的價格是$jiage,你一共猜了$n次"
exit 0

四 : until 語句

4.1 until語句的結構

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

4.2 until 語句應用實例

4.2.1計算1-50的和值

  • 通過循環累加的方式計算1-50的和值
#!/bin/bash
num=0
n=1
until [ $n -gt 50 ];do
  let  sum+=$n
  let n++
done
echo "$sum"

4.2.2爲指定用戶發送在線消息

  • 若用戶不在線(未登錄系統),則每10分鐘試一次,直至用戶登錄系統後再發送信息

  • 用戶名與消息通過位置參數傳遞給腳本

  • 方法一

    #!/bin/bash
    #判斷是否輸入參數
    if [ $# = 0 ];then
    echo "請輸入用戶名"
    exit 1
    fi
    #判斷用戶是否存在
    if grep "^$1" /etc/passwd &> /dev/null;then :
    else
     echo "用戶不存在"
    
     exit 2
    fi
    #判斷用戶是否在線
    until who | grep "$1" &> /dev/null;do
      echo "用戶不在線"
      sleep 3
    done
    #給用戶發消息
    
    echo "$*" | write "$1"
    
  • 方法二

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

不可以then 和else 中爲空

五 : shell函數

  • 將命令序列按格式寫在一起
  • 可方便重複使用命令序列
  • shell函數定義
  • 調用函數的方法
    • 函數名 [參數1] [參數2]
    • 參數1就是位置參數$1,參數2就是位置參數$2

5.1 函數格式

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

封裝函數返回值

返回值分兩種,return 狀態 ————調用使用$?

​ echo 值 ————調用使用賦予變量

狀態用$?調,值用變量調

傳參數用位置變量傳進去

5.2 示例

5.2.1兩個數字求和

  • 通過sum (){}定義函數
  • 使用read命令交互輸入兩個數並求和
#!/bin/bash
function qiuehe(){
  sum=`expr $1 + 10`
    #echo "$sum"
    return $sum
    echo "$?"
}
qiuehe $1
~            

5.2.2 編寫登錄系統後便可使用的用戶自定義函數,執行命令servicectl httpd start

  • 編輯用戶自定義函數文件/root/function
  • 在當前shell中加載可執行的函數文件/root/function
  • 在~/.bash文件中添加source /root/function命令

  • systemctl start httpd
  • service httpd start

    新建一個service httpd start 命令

思路:

​ 1.驗證語法格式

2.驗證版本類型、驗證linux版本,只有centos7,才能使用servicectl命令 

​ 查看版本類型 cat /etc/centos-release

3.執行命令servicectl httpd start
  • 方法一
#!/bin/bash
function servicectl (){
#判斷格式是否正確
if [ $# -lt 2 ];then
        echo "用法錯誤,格式爲:servicectl <服務名> <選項>"
        exit 1
fi
#判斷系統版本是否爲centos7版本
if [ $(cat /etc/centos-release |awk '{print $4}' | awk -F. '{print $1}') -ge 7 ];then
        echo "符合版本centos7及以上要求,可以使用servicectl 命令"
        service $1 $2
else
   echo "你版本太低無法使用!"
fi
}
  • 方法二
#!/bin/bash
#這是系統啓動後用戶可以使用的一個自定義函數
#功能:開機啓動服務
#判斷使用腳本格式是否正確,即參數個數判斷
function format(){
echo $#
if [ $# -ne 2 ]
then
 echo "你輸入的參數格式不正確,UsageMethod:serve <cmd> <serve> "
 exit 1
fi
}
#判斷使用的Linux版本是否是Centos7版本
function version(){
echo "hello"
num=$(cat /etc/centos-release |awk '{print $4}' |awk -F. '{print $1}')
if [ $num -eq 7 ]
then
 echo "您的系統版本是centos的7版本且準備執行服務啓動腳本,請稍後"
fi 
}
#服務啓動
function serve(){
 format $1 $2
 version
 case $2 in 
 start)

  systemctl start httpd
  ;;
 stop)
  systemctl stop httpd
  ;;
 *)
  echo "nothing need to do"
 esac
}

六 : shell數組

6.1 應用場景

組有利於存放相同類型的數據,這句話也適用於java

數組內可以存放數據,數據類型有

1.整型 init 1 2 3 100

2.長整型 long

3.浮點型 單精度 float 4字節,帶小數點就是浮點型

4.string 字符串:char 字符 英文字母字符 a 佔一個字節;中文漢字字符,男 佔兩個字節而在java中,所有字符都佔兩個字節

5.boolean 布爾值 ture 和false

6.date 日期

7.html 標記語言 以標籤形式存在

下標或者索引用來去找數組內的數據

  • 獲取數組長度

索引是從0開始,

數組有長度,下面的例子就是4——數組長度

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

  • 獲取元素長度

數組最忌諱越界,越界取決於你的數組長度——abc[4],這樣就是越界了

索引下標一定是0開始

  • 遍歷元素

遍歷元素:循環

  • 元素切片
  • 元素替換
  • 元素刪除
  • ·······

6.2 數組定義方法

  • 數據與數據之間用空格隔開,即數組元素之間使用空格隔開

6.2.1 方法一

數組名 = (value0 value1 value2......)

abc = (10 20 30 )

最簡單的方式,動態輸入,也叫可變長數組

6.2.2 方法二

數組名 = ([0] = value [1] = value [2] = value......)

abc = ([0] = 10 [1] = 20 [2] = 30 .......)

6.2.3 方法三

列表名 = ”value0 value1 value2 ......“

數組名 = ($列表名)

給數組名賦予列表名,列表名裏有數據

6.2.4 方法四

數組名[0]="value" abc[0] = 10

數組名[1]="value" abc[1] = 20

數組名[2]="value" abc[2] = 30

......

這種方法不建議使用

6.3 數組包括的數據類型

  • 數值類型
  • 字符類型
    • 使用”或“定義

不可以放入對象

shell當中沒有二維數組

6.4 shell數組操作

  • 獲取數組長度————${數組名[@/*]}
    • @或,可以理解爲通配符號,類似於$ ,可以查看數組內的所有數據 ${abc[ * ]}、${abc[@]}
  • 讀取某下標賦值————${數組名[下標]}
    • ${abc[2]}
  • 數組遍歷
  • ${#abc[]},即在獲取數組長度的基礎上,在數組名加#,echo查看${#abc[ ]} 該數組的數據個數,類似於$#
  • 即:${abc[*]}加#號是統計數字;不加#號,是把數組內的所有位置全部顯示出來

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

數組遍歷示例

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

1575017890712

6.4.1 比大小

理論+實操:shell之case語句for/while/until循環語句、函數、數組-滿滿的乾貨

max=0
for ((i=1;i<=5;i++))
do
read -p "請輸入第$i個數字" num
a=i-1
abc[a]=$num
if [ ${abc[a]} -gt $max ]
then
max=${abc[a]}
fi
done
echo ${abc[*]} 
echo "最大值爲 $max"

6.4.2 給數組排序、插數後再排序

#/bin/bash
  2 for ((i=1;i<=5;i++))
  3 do
  4 read -p "請輸入第$i個數字" num
  5 a=$i-1
  6 c=$a-1
  7 abc[a]=$num
  8 done
  9 #降序
 10 b=0
 11 for ((j=0;j<=c;j++))
 12 do
 13   for ((i=0;i<=c;i++))
 14   do
 15     ii=`expr $i + 1`
 16     if [ ${abc[$i]} -le ${abc[$ii]} ]
 17     then
 18     b=${abc[$i]}
 19     abc[$i]=${abc[$ii]}
 20     abc[$ii]=$b
 21     fi
 22   done
 23 done
 24 echo ${abc[*]}
 #升序
 25 mb=0
 26 for ((j=0;j<=c;j++))
 27 do
 28   for ((i=0;i<=c;i++))
 29   do
 30     ii=`expr $i + 1`
 31     if [ ${abc[$i]} -ge ${abc[$ii]} ]
 32     then
 33     mb=${abc[$i]}
 34     abc[$i]=${abc[$ii]}
 35     abc[$ii]=$mb
 36     fi
 37   done
 38 done
 39 echo ${abc[*]}
 40 read -p "輸入你想插的數" xnum
 41 i=$a+1
 42 abc[i]=$xnum
 43 
 44 for ((f=0;f<=i;f++))
 45 do
 46   for ((g=0;g<=a;g++))
 47   do
 48     gg=$(expr $g + 1)
 49     if [ ${abc[$g]} -le ${abc[$gg]} ]
 50     then
 51     b=${abc[$g]}
 52     abc[$g]=${abc[$gg]}
 53     abc[$gg]=$b
 54     fi
 55   done
 56 done
 57 echo ${abc[*]}

拓展

1.求ax^2+bx+c=0的解,a、b、c爲手動輸入

  • 平方根示例
#!/bin/bash
a=9
b=$(awk -v x=$a 'BEGIN{print sqrt(x)}')
echo $b
b=$(echo "$a" | awk '{print sqrt($1)}')
echo $b
b=$(echo | awk "{print sqrt($a)}")
echo $b
b=$(bc <<< "scale=6; sqrt($a)")         #scale=6,表示結果保留6位小數
echo $b
b=$(echo "scale=6; sqrt($a)" | bc)
echo $b
b=`"sqrt($a)"`
echo $b
  • 方法
#!bin/bash
echo "求二元一次方程解ax^2 + bx + c = 0"
read -p "請輸入a:" a
read -p "請輸入b:" b
read -p "請輸入c:" c
echo "你輸入的方程爲"$a"x^2 + "$b"x + $c = 0"
if [ $a -eq 0 ]
then
  if [ $b -eq 0 ]&&[ $c -ne 0 ]
  then
  echo "你輸入的格式有誤,a、b、c不能同時等於0,否則x等於任何數"
  else
  x=`expr $c / $b`
  echo "該方程只有一個解,即x=-$x"
  fi
else [ $a -ne 0 ]
era=`expr $a \* 2`
b2=`expr $b \* $b`
ac=`expr $a \* $c`
siac=`expr 4 \* $ac`
gx=`expr $b2 - $siac`
if [ $gx -lt 0 ];then echo "無解" && exit 1
fi      
gxj=$(bc <<< "sqrt($gx)")
q=`expr 0 - $b`
fs1=`expr $q + $gxj`
fs2=`expr $q - $gxj`
j1=`expr $fs1 / $era`
j2=`expr $fs2 / $era` 
echo "x1 = $j1 ;x2 = $j2" 
fi
#!/bin/bash
echo please input the number a
read a
echo please input the number b
read b
echo please input the number c
read c
(( d = b*b - 4*a*c))
if [ $a -eq 0 ]
then
(( x = - c/b))
echo the number of x is: $x
elif [ $d -gt 0 ]
then
(( x= a*x*x + b*x +c))
echo the number of x is: $x
else
echo x has no answer
fi

2.購物中心做活動,購買食物滿500元打8折,購買日用滿300元打9折,購買衣服滿1000打7折,每類商品都有三種(分別起名字)

需求:程序運行後可以任意選擇商品類別,進入商品類別後可以選擇不購買或購買哪一個商品,退出某類別後還可以進入該類別進行購買

3.輸入星期幾的英文單詞來判斷星期幾

#!/bin/bash
echo "請輸入星期的英文單詞"
read w
case $w in
Monday)
echo "星期一"
;;
Tuesday)
echo "星期二"
;;
Wednesday)
echo "星期三"
;;
Thursday)
echo "星期四"
;;
Friday)
echo "星期五"
;;
Saturday)
echo "星期六"
;;
Sunday)
echo "星期日"
;;
*)
echo "輸入錯誤"
esac

4.將按順序輸入的5個字符以相反的順序打印出來

#!/bin/bash
echo "請輸入五個字符,以空格隔開"
read a b c d e
echo "$e $d $c $b $a"

5.一個5位數,判斷它是不是迴文數。即12321是迴文數,個位與萬位相同,十位與千位相同。

#!/bin/bash
read -p "請輸入一個五位數字" num
w=$(expr $num / 10000)
q=$(expr $num / 1000)
until [ $q -lt 10 ]
do
let q-=10
done
b=$(expr $num / 100)
until [ $b -lt 10 ]
do
let b-=10
done
s=$(expr $num / 10)
until [ $s -lt 10 ]
do
let s-=10
done
g=$num
until [ $g -lt 10 ]
do
let g-=10
done
if [ $w -eq $g ]&&[ $q -eq $s ]
then
echo "$num這個數是一個迴文數"
else
echo "$num這個數不是迴文數"
fi

總結

1. case語句的結構

2.for語句的結構

3.while語句的結構

4.until語句的結構

5. 數組定義方法

6. shell腳本調試方法

aca認證,acp認證

1575010845821

continue

1575011155791

-z 驗證位置變量是否爲空,使用或||,則中括號爲兩對,

使用source function去加載

1575011568048

作業:做一個菱形

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章