使用雙分支的 if 條件語句來驗證某台主機是否線上,然後根據傳回值的結果,要麼顯示主機線上資訊,要麼顯示主機不線上資訊。這裡的腳本主要使用 ping 指令來測試與對方主機的網絡聯通性,而 Linux 系統中的 ping 指令不像 Windows 一樣嘗試 4 次就結束,是以為了避免使用者等待時間過長,需要通過-c 參數來規定嘗試的次數,并使用-i 參數定義每個資料包的發送間隔,以及使用-W 參數定義等待逾時時間。
chkhost.sh内容
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi
事例:
[[email protected] ch4]# sh chkhost.sh 192.168.1.1
Host 192.168.1.1 is On-line.
[[email protected] ch4]# sh chkhost.sh 192.168.1.2
Host 192.168.1.2 is Off-line.
下面使用 for 循環語句從清單檔案中讀取多個使用者名,然後為其逐一建立使用者賬戶并設定密碼。首先建立使用者名稱的清單檔案 users.txt,每個使用者名稱單獨一行。讀者可以自行決定具體的使用者名稱和個數:
[[email protected] ch4]# vim users.txt
andy
barry
carl
duke
eric
george
接下來編寫 Shell 腳本 Example.sh。在腳本中使用 read 指令讀取使用者輸入的密碼值,然後指派給 PASSWD 變量,并通過-p 參數向使用者顯示一段提示資訊,告訴使用者正在輸入的内容即将作為賬戶密碼。在執行該腳本後,會自動使用從清單檔案 users.txt 中擷取到所有的使用者名稱,然後逐一使用“id 使用者名”指令檢視使用者的資訊,并使用$?判斷這條指令是否執行成功,也就是判斷該使用者是否已經存在。需要多說一句,/dev/null 是一個被稱作 Linux 黑洞的檔案,把輸出資訊重定向到這個檔案等同于删除資料(類似于沒有回收功能的垃圾箱),可以讓使用者的螢幕視窗保持簡潔。
#!/bin/bash
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME,Create success"
else
echo "$UNAME,Create failure"
fi
fi
done
執行批量建立使用者的 Shell 腳本 Example.sh,在輸入為賬戶設定的密碼後将由腳本自動檢查并建立這些賬戶。由于已經将多餘的資訊通過輸出重定向符轉移到了/dev/null 黑洞檔案中,是以在正常情況下螢幕視窗除了“使用者賬戶建立成功”(Create success)的提示後不會有其他内容。在 Linux 系統中,/etc/passwd 是用來儲存使用者賬戶資訊的檔案。如果想确認這個腳本是否成功建立了使用者賬戶,可以打開這個檔案,看其中是否有這些新建立的使用者資訊。
[[email protected] ch4]# sh Example.sh
Enter The Users Password : 1111111
andy,Create success
barry,Create success
carl,Create success
duke,Create success
eric,Create success
george,Create success
[[email protected] ch4]# tail -6 /etc/passwd
andy:x:504:506::/home/andy:/bin/bash
barry:x:505:507::/home/barry:/bin/bash
carl:x:506:508::/home/carl:/bin/bash
duke:x:507:509::/home/duke:/bin/bash
eric:x:508:510::/home/eric:/bin/bash
george:x:509:511::/home/george:/bin/bash
參照上面的例子,批量删除使用者的bash 腳本
#!/bin/bash
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
userdel $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "delete $UNAME success"
else
echo "delete failure"
fi
else
echo "$UNAME is\'t not exists"
fi
done
~
您還記得在學習雙分支 if 條件語句時,用到的那個測試主機是否線上的腳本麼?既然我們現在已經掌握了 for 循環語句,不妨做些更酷的事情,比如嘗試讓腳本從文本中自動讀取主機清單,然後自動逐個測試這些主機是否線上。
首先建立一個主機清單檔案 ipadds.txt:
[[email protected] ch4]# cat ipadds.txt
192.168.1.1
192.168.1.2
www.baidu.com
www.sina.com
www.163.com
www.aaa.com
然後前面的雙分支 if 條件語句與 for 循環語句相結合,讓腳本從主機清單檔案 ipadds.txt中自動讀取 IP 位址(用來表示主機)并将其指派給 HLIST 變量,進而通過判斷 ping 指令執行後的傳回值來逐個測試主機是否線上。腳本中出現的$(指令)是一種完全類似于第 3 章的轉義字元中反引号`指令`的 Shell 操作符,效果同樣是執行括号或雙引号括起來的字元串中的指令。大家在編寫腳本時,多學習幾種類似的新方法,可在工作中大顯身手:
#!/bin/bash
HLIST=$(cat ./ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ]; then
echo "Host $IP is On-line."
else
echo "Host $IP is Off-line."
fi
done
[[email protected] ch4]# sh CheckHosts.sh
Host 192.168.1.1 is On-line.
Host 192.168.1.2 is Off-line.
Host www.baidu.com is On-line.
Host www.sina.com is On-line.
Host www.163.com is On-line.
Host www.aaa.com is Off-line.