Shell流程控制
流程控制是改變程序運行順序的指令。linux shell有一套自己的流程控制語句,其中包括條件語句(if),循環語句(for,while),選擇語句(case)。下面我將通過例子介紹下,各個語句使用方法
if語句
格式:if list; then list; [ elif list; then list; ] ... [ else list; ] fi
1、單分支
if 條件表達式; then
命令
fi
2、雙分支
if 條件表達式; then
命令
else
命令
fi
實例1判斷crond進程是否正在運行
-v:表示取反;-c:即count,取代通常的輸出,顯示行數
1 #!/bin/bash 2 NAME=crond 3 NUM=$(ps aux |grep $NAME |grep -vc grep) 4 if [ $NUM -eq 1 ];then
5 echo "$NAME running."
6 else
7 echo "$NAME is not running!"
8 fi
實例2:檢查主機是否在線
-c:表示發送幾次包;-w:表示等待時間。當試圖簡寫不可達主機時此選項很有用
1 #!/bin/bash 2 if ping -c 1 192.168.11.5 &>/dev/null;then 3 echo "OK" 4 else 5 echo "NO" 6 fi
1 #!/bin/bash 2 read -p "請輸入您想檢測的IP地址:" ip 3 ping -c 1 -w 1 $ip &>/dev/null 4 if [ $? -eq 0 ];then 5 echo "OK" 6 else 7 echo "NO" 8 fi
if 語句可以直接對命令狀態進行判斷,就省去了獲取$?這一步!
如果我們不想讓用戶看到命令的執行結果,可以把執行結果追加到/dev/null文件中(黑洞文件)
3、多分支
if 條件表達式; then
命令
elif 條件表達式; then
命令
else
命令
fi
當不確定條件符合哪一個時,就可以把已知條件判斷寫出來,做相應的處理。
實例:
$1:表示接受用戶輸入參數
1 #!/bin/bash 2 N=$1 3 if [ $N -eq 3 ];then 4 echo "eq 3" 5 elif [ $N -eq 5 ];then 6 echo "eq 5" 7 elif [ $N -eq 8 ];then 8 echo "eq 8" 9 else 10 echo "no" 11 fi
[root@ren5 ~]# sh c.sh 3
eq 3
如果第一個條件符合就不再向下匹配
If語句實戰案例
1、完成用戶輸入文件或者目錄的自動復制,並可以實現用戶指定復制目標位置;用戶體驗佳。
1 #!/bin/bash 2 read -p "請輸入你想復制的文件或目錄:" file 3 if [ -f "$file" -o -d "$file" ];then 4 read -p "是否確定要復制該文件(y/n)" sure 5 confirm=$(echo ${sure} |tr A-Z a-z ) 6 if [ "$confirm" == "y" ];then 7 read -p "請輸入你要復制的位置:" place 8 if [ -d "$place" ];then 9 cp -a $file $place 10 echo "$file已經復制到$place。" 11 else 12 echo "$place位置不存在" 13 exit 14 fi 15 elif [ "$confirm" == "n" ];then 16 echo "再見" 17 else 18 echo "請輸入y或n" 19 fi 20 else 21 echo "$file不存在" 22 fi
2、嘗試寫一個shell簡單的計算器,實現加減乘除。
請輸入一個數字: 7
請輸入運算符:+
請輸入第二個數字:7
7+7=14
1 #!/bin/bash 2 read -p "請輸入第一個數字:" NUM1 3 read -p "請輸入運算符[+-*/]:" CHA 4 read -p "請輸入第二個數字:" NUM2 5 if [ -n "$NUM1" -a -n "$CHA" -a -n "$NUM2" ];then 6 if [ "$CHA" == "+" ];then 7 echo "$NUM1+$NUM2=$(($NUM1+$NUM2))" 8 elif [ "$CHA" == "-" ];then 9 echo "$NUM1-$NUM2=$(($NUM1-$NUM2))" 10 elif [ "$CHA" == "*" ];then 11 echo "$NUM1*$NUM2=$(($NUM1*$NUM2))" 12 elif [ "$CHA" == "/" ];then 13 echo "$NUM1/$NUM2=$[$NUM1/$NUM2]" 14 else 15 echo "請輸入[+-*/]" 16 fi 17 else 18 echo "請輸入內容!" 19 fi
1 #!/bin/bash 2 read -p "請輸入第一個數字:" NUM1 3 read -p "請輸入運算符[+-*/]:" CHA 4 read -p "請輸入第二個數字:" NUM2 5 count () { 6 echo "${NUM1}${CHA}${NUM2}=$((${NUM1}${CHA}${NUM2}))" 7 } 8 error () { 9 echo "Usage:$0 {+|-|*|/}" 10 } 11 if [ -n "$NUM1" -a -n "$CHA" -a -n "$NUM2" ];then 12 if [ "$CHA" == "+" ];then 13 count 14 elif [ "$CHA" == "-" ];then 15 count 16 elif [ "$CHA" == "*" ];then 17 count 18 elif [ "$CHA" == "/" ];then 19 count 20 else 21 error 22 fi 23 else 24 echo "請輸入內容!" 25 fi
3、輸入一個用戶,用腳本判斷該用戶是否存在。
1 #!/bin/bash 2 read -p "請輸入用戶名:" USER 3 TOF=$(cat /etc/passwd |awk -F: '{print $1}' |grep -w "$USER" -c) 4 if [ $TOF -eq 0 ];then 5 echo "該用戶不存在" 6 else 7 echo "該用戶存在" 8 fi

