針對變量的不一樣取值,分別執行不一樣的命令列shell
case 變量值 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; ..... *) 默認命令序列 esac
示例:apache
字符類型識別:編程
腳本以下:vim
[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 變量名 in 取值列表 do 命令序列 done
示例1:bash
批量添加用戶:tcp
具體實驗以下:ide
[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地址檢查主機狀態:post
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 條件測試操做 do 命令序列 done
示例1:
批量添加用戶:
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:
猜商品價格:
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 條件測試操做 do 命令序列 done
示例1:
計算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:
爲指定用戶發送在線消息:
腳本以下:
#!/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
將命令序列按格式寫在一塊兒可方便重複使用命令序列。
[ function ] 函數名(){ 命令序列 [return x] } //使用return或exit能夠顯式地結束函數
函數名 [參數1] [參數2]
示例:
兩個數字求和:
實驗以下:
[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]#
數組名= (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
語法:sh [-nvx] 腳本名
經常使用選項:
-n:不執行腳本,僅檢查語法。沒有語法問題不顯示任何內容,有問題提示報錯。 -v:執行腳本時,先顯示腳本內容,而後執行腳本。存在錯誤時,給出錯誤提示。 -x:將執行的腳本內容輸出到屏幕上。
set -x:開啓調節模式 set +x:關閉調節模式