Shell編程之case多分支語句、循環語句(for、while等)、Shell函數、Shell數組

case多分支語句

case語句的結構:

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

case  變量值  in
模式1)
    命令序列1
	;;
模式2)
    命令序列2
    ;;
.....
*)
默認命令序列
esac

示例

字符類型識別:

  • 提示用戶輸入一個字符;
  • 判斷出該字符是字母、數字或者其他字符。

腳本如下:

[root@localhost opt]# vim test01.sh
#!/bin/bash
read -p "請輸入一個字符:" key
case $key in
[a-z]|[A-Z])
        echo "你輸入的是字母"
;;
[0-9])
        echo "你輸入的是數字"
;;
*)
        echo "你輸入的是特殊符號"
esac

執行結果如下:

[root@localhost opt]# chmod +x test01.sh 
[root@localhost opt]# ./test01.sh 
請輸入一個字符:3
你輸入的是數字
[root@localhost opt]# ./test01.sh 
請輸入一個字符:d
你輸入的是字母
[root@localhost opt]# ./test01.sh 
請輸入一個字符:#
你輸入的是特殊符號
[root@localhost opt]# 

循環語句

for循環語句:

循環結構:讀取不同的變量值,用來逐個執行同一組命令。

for  變量名  in  取值列表
do
    命令序列
done

示例1

批量添加用戶:

  • 用戶名存放在users.txt文件中,每行一個;
  • 初始密碼均設爲123456;
  • 驗證腳本。

具體實驗如下

[root@localhost opt]# tail -5 /etc/passwd
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
jiang:x:1000:1000:jiang:/home/jiang:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@localhost opt]# vim users.txt
[root@localhost opt]# cat users.txt 
zhangsan
lisi
wangwu
zhaoliu
[root@localhost opt]# vim test02.sh
[root@localhost opt]# cat test02.sh                                         //shell腳本如下
#!/bin/bash
TMP=$(cat /opt/users.txt)
for USER in $TMP
do
	useradd $USER && echo "123456" | passwd --stdin $USER &> /dev/null
done
[root@localhost opt]# chmod +x test02.sh 
[root@localhost opt]# ./test02.sh 
[root@localhost opt]# tail -5 /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
lisi:x:1002:1002::/home/lisi:/bin/bash
wangwu:x:1003:1003::/home/wangwu:/bin/bash
zhaoliu:x:1004:1004::/home/zhaoliu:/bin/bash
[root@localhost opt]# 
[root@localhost opt]# su zhangsan
[zhangsan@localhost opt]$ su lisi
密碼:
[lisi@localhost opt]$

示例2

根據IP地址檢查主機狀態:

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

shell腳本如下:

#!/bin/bash
TMP=$(cat /opt/ipadds.txt)
for USER in $TMP
do
 ping -c 3 -i 0.2 -w 3 $USER &> /dev/null
 if [ $? -eq 0 ]
 then
  echo "$USER is up"
 else
  echo "$USER is down"
 fi
done

while循環語句:

循環結構:重複測試某個條件,只要條件成立則反覆執行。

while  條件測試操作
do
    命令序列
done

示例1

批量添加用戶:

  • 用戶名稱以stu開頭,按數字順序進行編號;
  • 一共添加10個用戶,即stu1、 stu2、…stu20;
  • 初始密碼均設爲123456。

shell腳本如下:

#!/bin/bash
PRE="stu"
num=1
while [ $num -le 10 ]
do
  useradd $PRE$num
  echo "123456" | passwd --stdin $PRE$num &> /dev/dull
 let num++
done

示例2

猜商品價格遊戲:

  • 通過變量RANDOM獲得隨機數;
  • 提示用戶猜測並記錄次數,猜中後退出循環。

shell腳本如下:

#!/bin/bash
TIMES=0
PRICE=$(expr $RANDOM % 1000)
while true
do
read -p "請猜價格(0-999):" money
let TIMES++
     if [ $money -gt $PRICE ]
     then 
         echo "您猜的太大"
     elif [ $money -lt $PRICE ]
     then       
         echo "您猜的太小"
     else         
         echo "您猜對了,正確價格爲:$num"
         echo "您一共猜了$TIMES次"
     break 
     fi 
done 

until循環語句:

循環結構:重複測試某個條件,只要條件不成立則反覆執行。

until  條件測試操作
do
   命令序列
done

示例1

計算1~50的和值:

  • 通過循環累加的方式計算1~50的和值。

實驗如下:

[root@localhost opt]# vim test04.sh
[root@localhost opt]# cat test04.sh 
#!/bin/bash
i=0
sum=0
until [ $i -eq 51 ]
do
	let sum+=i
	let i++
done
echo $sum
[root@localhost opt]# chmod +x test04.sh 
[root@localhost opt]# ./test04.sh 
1275
[root@localhost opt]# 

示例2
爲指定用戶發送在線消息:

  • 若用戶不在線(未登錄系統),則每10分鐘試一次, 直至用戶登錄系統後在發送信息;
  • 用戶名與消息通過位置參數傳遞給腳本。

腳本如下:

#!/bin/bash
username=$1
#判斷信息格式
if [ $# -lt 1 ];then
        echo "Usage:`basename $0`<username> [<message>]"
        exit 1
fi
#判斷用戶是否存在
if grep "^$username:" /etc/passwd > /dev/null
then :
else
        echo "用戶不存在"
        exit 1
fi
#用戶是否在線,如果不在線每5秒聯繫一次
until who|grep "^$username" > /dev/null
do
        echo "用戶不在線"
        sleep 5
done
mes=$*
echo $mes | write $username

Shell函數

Shell函數定義:

將命令序列按格式寫在一起可方便重複使用命令序列。

[ function ] 函數名(){
    命令序列
		[return x]
}                                              //使用return或exit可以顯式地結束函數

調用函數的方法:

函數名 [參數1] [參數2]

示例

兩個數字求和:

  • 通過sum () {}定義函數;
  • 通過調用函數求兩個數和。

實驗如下:

[root@localhost opt]# vim test06.sh 
[root@localhost opt]# cat test06.sh 
#!/bin/bash
sum(){
	s=`expr $1 + $2`
	echo $s 
}
[root@localhost opt]# chmod +x test06.sh 
[root@localhost opt]# ./test06.sh 
[root@localhost opt]# sum 5 6
11
[root@localhost opt]#

Shell數組

應用場景包括:

  • 獲取數組長度
  • 獲取元素長度
  • 遍歷元素
  • 元素切片
  • 元素替換
  • 元素刪除

數組定義方法:

  • 方法一

數組名= (value0 value1 value2 ..)

  • 方法二

數組名= ([0]=value [1]=value [2]=value ...) //數組元素之間使用空格隔開

  • 方法三
列表名="value0 value1 value2 ..."
數組名= ($列表名)
  • 方法四
數組名[0]="value”
數組名[1]="value"
數組名[2]="value"

數組包括的數據類型:

  • 數值類型
  • 字符類型:使用" "或’ '定義

獲取數組長度:

格式:${#數組名[@\*]}

實例:
[root@localhost ~]# arr_ nymber=(1 2 3 4 5);
[root@localhost ~]#arr_ length=${#arr_ number[*]}
[root@localhost ~]# echo $arr length
5

讀取某下標的賦值:

格式:${數組名[下標]}

實例:
[root@localhost ~]#arr_ index2=${arr_ number[2]}
[root@localhost ~]# echo $arr_ index2
3

數組遍歷:

[root@localhost ~]# for v in 
${arr_ number[@]}
> do
>     echo $V
> done
1
2
3
4
5

Shell腳本調試

echo命令

bash命令

語法:sh [-nvx] 腳本名

常用選項:

-n:不執行腳本,僅檢查語法。沒有語法問題不顯示任何內容,有問題提示報錯。
-v:執行腳本時,先顯示腳本內容,然後執行腳本。存在錯誤時,給出錯誤提示。
-x:將執行的腳本內容輸出到屏幕上。

set命令

set -x:開啓調節模式
set +x:關閉調節模式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章