shell指令碼程式設計之選擇控制結構
shell指令碼程式設計之選擇控制結構
程式開發語言,分為兩種,一種是解釋型語言,一種是編譯型語言。解釋型語言是解釋語句,並且能根據流程控制機制讓語句按需執行,解釋一條語句就返回語句的結果,這種語言需要一個直譯器,而linux中的bash就是這樣的一個直譯器,常見的解釋型語言有perl,python,ruby,bash。編譯型語言,首先需要編譯源程式,並且能夠將源程式轉換為二進位制格式,而後讓其執行,這種語言需要一個編輯器,如linux下的gcc就是一個編輯器,編譯型語言有C,C++,C#等。無論是解釋型語言還是編譯型語言,都有語言控制結構,沒有控制結構的程式,不能算做一個好的程式。
語言控制結構分為三種:
順序執行:預設法則,逐條執行各語句
選擇執行:條件判斷,只有部分是符合條件的,只執行符合條件的部分
迴圈執行:將同一段程式碼反覆的執行n次
這篇部落格寫關於選擇控制結構。
linux的選擇控制結構有兩種一種是 if-then,一種是case--esac。
1、if-then
bash條件測試:
[ expression ]
` expression `
test expression
bash命令
if-then有三種結構形式:
單分支if語句
if [ 條件 ];then
語句...
fi
這種單分支的語句,當條件滿足的時候,就會執行then後面的語句,不滿足就直接退出判斷語句
eg:系統中是否存在mysql使用者,存在就顯示mysql exist.
#!/bin/bash
#this shell test mysql user exist system.
if id mysql ;then
echo "mysql exist."
fi
雙分支if語句
if [ 條件 ];then
語句...
else
語句...
fi
這種雙分支的語句,等條件滿足的時候就會執行then後面的語句,條件不滿足的時候就執行else後面的語句。
eg1:如果指定的使用者存,先說明其已經存在,並顯示其ID號和SHELL;否則,就新增使用者,並顯示其ID號;
#!/bin/bash
Username=mysql
if id $Username &>/dev/null;then
Id=`grep "^$Username>" /etc/passwd | cut -d: -f3`
Shell=`grep "^$Username>" /etc/passwd | cut -d: -f7`
echo "$Username exist,ID is $Id,shell is $Shell."
else
useradd $Username
Id=`grep "^$Username>" /etc/passwd | cut -d: -f3`
echo "$Username ID is $Id."
fi
eg2:判斷使用者是否存在,存在則顯示ID和SHELL,不存在就新增使用者,並顯示其ID。
分析:這題與上一個列子不一樣的地方是這個使用者沒有指定,既然沒有指定,就需要自己手動去shell一個引數,而指令碼怎麼去引用引數。這裡就用到了bash變數中的位置變數
位置變數:$1,$2.....$9($1就是指令碼傳遞的第一個引數...)
$0:指令碼自身名稱
$@:所有位置引數的列表
$*:所有位置引數
$#:位置引數的個數
#!/bin/bash
if id $1 &>/dev/null;then
Id=`grep "^$1>" /etc/passwd | cut -d: -f3`
Shell=`grep "^$1>" /etc/passwd | cut -d: -f7`
echo "$1 exist,ID is $Id,shell is $Shell."
else
useradd $1
Id=`grep "^$1>" /etc/passwd | cut -d: -f3`
echo "$1 ID is $Id."
fi
執行指令碼 bash eg2.sh mysql (eg.sh是指令碼的名稱,mysql是傳遞給指令碼的第一個引數)
eg3:透過引數傳遞一系列使用者名稱給指令碼,讓指令碼新增這些使用者;但要先判斷使用者是否存在,不存在而後再新增;新增完成後,顯示一共新增了幾個使用者;當然,不能包括因為事先存在而沒有新增的;
分析:這個指令碼不明確的是不知道要傳遞幾個引數,所以用位置變數有點不符合要求,所以引用了$@這個特殊的變數,然後這些使用者,你得一個一個的去取這些使用者,然後進行判斷是否存在,用迴圈控制瞭如何一個一個的取這些使用者,然後使用者不能重複的一個一個的取,所以使用者得取一個T掉$@列表中的使用者,用了shift命令,shift命令就是輪流的T除使用者。
#!/bin/bash
count=0
for user in $@;do
if id $1 &>/dev/null;then
echo "user $1 exsit."
shift
else
useradd $1
count=$[$count+1]
echo "add $1."
shift
fi
done
echo "total users:$count"
執行指令碼
影像 17.png
巢狀if語句(最常見的巢狀)
if [ 條件1 ];then
if [ 條件2 ];then
語句...
else
語句.....
fi
else
語句....
fi
這種巢狀的if語句就相對複雜一點,當條件1滿足時,就執行第一個then後面的語句,在條件1滿足後,在判斷條件2,當條件1和條件2同時滿足的時候就會執行第二個then後面的語句,當只有條件1滿足,條件2不滿足就會執行第一個else後面的語句,如果條件1都不滿足,那就直接執行第二個else後面的語句了。
eg4:判斷一個使用者,如果存在則判斷是否是普通使用者,還是系統使用者,還是admin使用者。不存在則顯示該使用者不存在。
分析:首先判斷使用者是否存在,存在則比較使用者的ID是否為大於等於500,大於等於500則表示為普通使用者,是否1-499,是則表示為系統使用者,是否為0,是則為admin使用者。
本例子還用到了數值的比較,然後還用到了條件的組合
linux test命令支援數值比較、字串比較、檔案比較 詳情請man test
數值比較
num1 -eq num2 檢查num1是否等於num2
num1 -ge num2 檢查num1是否>或等於num2
num1 -gt num2 檢查num1是否大於num2
num1 -le num2 檢查num1是否<等於num2
num1 -lt num2 檢查num1是否<num2
num1 -ne num2 檢查num1是否不等於num2
組合條件測試
-a:與 [ $Uid -ge 1 -a $Uid -le 499 ]
-o:或 [ $Uid -eq 0 -a $Uid -ge 500 ]
!:非,單目運算子 [ ! $Uid -eq 0 ]
#!/bin/bash
if id $1 &> /dev/null;then
Id=`grep "^$1>" /etc/passwd | cut -d: -f3`
if [ $Id -ge 500 ];then
echo "$1 is common user."
elif [ $Id -lt 500 -a $Id -ge 1 ];then
echo "$1 is system user."
else
echo "$1 is admin user."
fi
else
echo "$1 Not exist."
fi
指令碼執行結果
影像 18.png
eg5:判定使用者的shell是否為登入shell;
分析:首先判斷使用者的shell是否存在,redhat中有一個使用者的shell就為空,如果shell存在則判斷shell是否為bash,如果是則表示為登入使用者,如果不是則表示為不能登入使用者。在redhat 5.x的版本上。
字串比較
str1 = str2 檢查str1與str2是否相同
str1 != str2 檢查str1與str2是否不同
str1 < str2 檢查str1是否小於str2
str1 > str2 檢查str1是否大於str2
-n str1 檢查str1的長度是否大於0
-z str1 檢查str1的長度是否為0
=~:判斷左邊的字串是否能夠被右邊的模式所匹配,通常用於[[]]; [[ "$opt1" =~ pattern ]],
一般錨定行首和行尾
#!/bin/bash
Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`
if [ -z $Shell ];then
echo "$1 user no shell"
else
if [ "$Shell" == "/bin/bash" ]; then
echo "$1 user shell is login shell."
else
echo "$1 user shell is nologin shell."
fi
fi
執行結果
影像 19.png
eg6:判斷當前主機的CPU生產商,其資訊在/proc/cpuinfo檔案中vendor id一行中。如果其生產商為GenuineIntel,就顯示其為Intel公司;否則,就顯示其為AMD公司;
#!/bin/bash
Vendor=`grep "vendor_id" /proc/cpuinfo | uniq | cut -d: -f2`
if [[ "$Vendor" =~ [[:space:]]*GenuineIntel$ ]]; then
echo "Intel"
else
echo "AMD"
fi
執行結果
[root@Redhat5 test]# bash eg6.sh
Intel
eg7:
寫一個指令碼:可以接受一個引數,其使用形式如下:
script.sh {start|stop|restart|status}
如果引數為start,建立空檔案/var/lock/subsys/script,並顯示“Starting script successfully.”;
如果引數為stop,則刪除檔案/var/lock/subsys/script,並顯示“Stop script finished.”;
如果引數為restart,則刪除檔案/var/lock/subsys/script後重新建立,並顯示“Restarting script successfully.”;
如果引數為status,那麼:
如果/var/lock/subsys/script檔案存在,則顯示為“script is running.”
否則,則顯示為“script is stopped.”
其它任何引數:則顯示“script.sh {start|stop|restart|status}”
檔案比較
-b file 檢查檔案是否存在且是一個塊特殊檔案
-c file 檢查檔案是否存在且是一個字元檔案
-d file 檢查file是否存在並且是一個目錄
-e file 檢查檔案是否存在
-f file 檢查檔案是否存在並且是一個檔案
-h file 檢查檔案存在且為一個符合連結
-r file 檢查檔案是否存在並且可讀
-s file 檢查檔案是否存在且不為空
-w file 檢查檔案是否存在且可寫
-x file 檢查檔案是否存在且可執行
-O file 檢查檔案是否存在且別當前使用者擁有
-G file 檢查是否存在並且預設組是否為當前使用者組
#!/bin/bash
#Author:litaotao
dir=`basename $0`
if [ $1 == "start" ];then
touch /var/lock/subsys/$dir
echo "Starting script successfully."
elif [ $1 == "stop" ];then
rm /var/lock/subsys/$dir &> /dev/null
echo "Stop script finished."
elif [ $1 == "restart" ];then
rm /var/lock/subsys/$dir &> /dev/null
touch /var/lock/subsys/$dir
echo "Restarting script sucessfully."
elif [ $1 == "status" ];then
if [ -e /var/lock/subsys/$dir ];then
echo "script is running."
else
echo "script is stopped."
fi
else
echo "$dir.sh {statr|stop|restart|status}"
fi
執行方式 bash eg6.sh start 各位博友可以自己把shell copy後執行一遍分析結果
©著作權歸作者所有:來自51CTO部落格作者jie783213507的原創作品,如需轉載,請註明出處,否則將追究法律責任
shell指令碼 選擇控制結構linux shell指令碼
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2331/viewspace-2820725/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 選擇結構程式設計之習題程式設計
- 選擇結構程式設計程式設計
- Shell 指令碼程式設計陷阱指令碼程式設計
- shell指令碼程式設計筆記指令碼程式設計筆記
- 7.shell指令碼程式設計指令碼程式設計
- Shell 指令碼程式併發&程式數控制指令碼
- 【學習】Linux Shell指令碼程式設計Linux指令碼程式設計
- Shell程式設計-01-Shell指令碼初步入門程式設計指令碼
- Linux Shell指令碼程式設計-基礎1Linux指令碼程式設計
- shell高效程式設計:shell指令碼從未如此美麗程式設計指令碼
- Linux Shell指令碼程式設計while語句案例Linux指令碼程式設計While
- 好程式設計師雲端計算教程分享Shell程式設計之for迴圈結構程式設計師
- Linux shell程式設計(一)shell指令碼中的變數詳解Linux程式設計指令碼變數
- Shell指令碼程式設計規範與變數(shell指令碼必須要知道的規矩!)指令碼程式設計變數
- 史上最全shell指令碼程式設計語法上冊指令碼程式設計
- shell指令碼程式設計學習筆記-運算子指令碼程式設計筆記
- shell指令碼程式設計學習筆記——變數指令碼程式設計筆記變數
- shell指令碼總結指令碼
- 指令集體系結構_計算機體系結構:指令程式碼計算機
- LINUX Shell指令碼程式設計例項詳解(一)上Linux指令碼程式設計
- 雲端計算學習路線原始碼框架筆記:Shell程式設計之for迴圈結構原始碼框架筆記程式設計
- Linux之shell程式設計Linux程式設計
- Quick-Task 動態指令碼支援框架之結構設計篇UI指令碼框架
- 福大pta--C語言--選擇結構程式設計--判斷題C語言程式設計
- shell指令碼之迴圈指令碼
- Linux命令列與shell指令碼程式設計入門經驗Linux命令列指令碼程式設計
- Linux_day06_01_Shell指令碼程式設計_Bash基礎Linux指令碼程式設計
- 選擇結構
- 通用程式部署shell指令碼指令碼
- shell-----構建基本指令碼指令碼
- 《bash shell指令碼程式設計經典例項(第2版)》資源連結清單指令碼程式設計
- SELL 指令碼程式設計指令碼程式設計
- shell指令碼之if elif寫法指令碼
- 03_SHELL程式設計之條件判斷和流程控制程式設計
- 程式碼上線的shell指令碼指令碼
- shell程式設計之免互動程式設計
- JUC併發程式設計基石AQS原始碼之結構篇程式設計AQS原始碼
- Shell指令碼控制docker容器啟動順序指令碼Docker