流程控制語句
儘管可以通過使用linux命令、管道符、重定向以及條件測試語句編寫最基本的shell指令碼,但是這種指令碼並不適用於生產環境。原因是它不能根據真實的工作需求來調整具體的執行命令,也不能根據某些條件實現自動迴圈執行。
例如,我們需要批量建立 1000 為使用者,首先要判斷這些使用者是否已經存在;若不存在,則通過迴圈語句讓指令碼一次建立他們。
常用的有if、for、while、case這4種流程控制語句。
if 條件測試語句
1.1 單分支結構
if 條件測試操作
then 命令序列
fi#shell指令碼檔案內容
[root@rockman 0619]# cat mkcdrom.sh
#!/bin/bash
dir="/media/cdrom"
if [ ! -e $dir ]
then
mkdir -p $dir
fi#執行指令碼
[root@rockman 0619]# bash mkcdrom.sh
#檢視執行結果
[root@rockman 0619]# ls -l /media
total 0
drwxr-xr-x. 2 root root 6 jun 19 11:10 cdrom
1.2 多分支結構
if 條件測試操作1
then 命令序列1
elif 條件測試操作2
then 命令序列2
else
命令序列3
fi
在linux系統中,read是用來讀取使用者輸入資訊的命令,能夠把接收到的使用者輸入資訊賦值給後面的指定變數,-p引數用於向使用者顯示一定的提示資訊。
[root@rockman 0619]# cat chkscore.sh
#!/bin/bash
read -p "enter your score(0-100): " grade
if [ $grade -ge 85 ] && [ $grade -le 100 ]; then
echo "$grade is excellent"
elif [ $grade -ge 70 ] && [ $grade -le 84 ]; then
echo "$grade is pass"
else
echo "$grade is fail"
fi[root@rockman 0619]# bash chkscore.sh
enter your score(0-100): 98
98 is excellent
for條件迴圈語句
for 變數名 in 取值列表
do命令序列
done
下面使用for迴圈語句從列表檔案中讀取多個使用者名稱,然後為其逐一建立使用者賬號並設定密碼。
首先建立使用者名稱列表,每個使用者名稱單獨一行。
[root@rockman 0619]# vim users.txt
[root@rockman 0619]# cat users.txt
boblily
然後編寫shell指令碼,其中,/dev/null是乙個被稱作linux黑洞的檔案,把輸出資訊重定向到這個檔案等同於刪除資料(類似於沒有**功能的垃圾箱),可以讓使用者的螢幕保持簡潔。
[root@localhost 0619]# cat example.sh
#!/bin/bash
#批量新增使用者
#輸入使用者密碼(待建立的所有使用者)
read -p "enter the users password: " passwd
#對users.txt中的每乙個使用者名稱:檢查使用者名稱是否存在,如果存在,列印提示資訊;如果不存在,則新增使用者。新增成功或失敗,都列印出錯資訊
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"
fifi
done
執行批量建立使用者的shell指令碼。/etc/passwd是用來儲存使用者賬號資訊的檔案。如果想確認這個指令碼是否成功建立了使用者賬戶,可以開啟這個檔案,看其中是否有這些新建立的使用者資訊。
[root@localhost 0619]# bash example.sh
enter the users password: 1
bob, create success
lily, create success
[root@localhost 0619]# tail -5 /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:privilege-separated ssh:/var/empty/sshd:/sbin/nologin
hk:x:1000:1000:hk:/home/hk:/bin/bash
bob:x:1001:1001::/home/bob:/bin/bash
lily:x:1002:1002::/home/lily:/bin/bash
while條件迴圈語句
while 條件測試操作
do 命令序列
done
編寫shell指令碼。
[root@localhost 0619]# cat guess.sh
#!/bin/bash
price=$(expr $random % 1000)
times=0
echo "商品實際**為0-999之間,猜猜看是多少?"
while true
doread -p "請輸入您猜測的**數目:" int
let times++
if [ $int -eq $price ]; then
echo "恭喜你答對了,實際**是 $price"
echo "您共猜測了 $times 次"
exit 0
elif [ $int -gt $price ]; then
echo "太高了!"
else
echo "太低了!"
fidone
執行shell指令碼
[root@localhost 0619]# bash guess.sh
商品實際**為0-999之間,猜猜看是多少?
請輸入您猜測的**數目:555
太高了!
請輸入您猜測的**數目:333
太高了!
請輸入您猜測的**數目:222
太低了!
請輸入您猜測的**數目:300
太高了!
請輸入您猜測的**數目:255
太高了!
請輸入您猜測的**數目:244
太低了!
請輸入您猜測的**數目:250
太高了!
請輸入您猜測的**數目:247
太高了!
請輸入您猜測的**數目:246
恭喜你答對了,實際**是 246
您共猜測了 9 次
case條件測試語句(略) shell指令碼和流程控制
輸出 echo 注釋以 開頭,但唯獨第一行不是注釋,他代表當前shell的型別,下面寫乙個小例子 bin bash 直接寫命令 輸出當前時間 date 輸出當前使用者資訊 who 建立變數,變數和等號之間不能有空格,當字串之間沒有空格時可以直接賦值,有空格的要加雙引號 str1 i str str1...
shell指令碼之流程控制語句
一 分支控制語句 1 if fi條件 if condition then action fi2 if else fi條件 if condition then action else action fi3 if else if else fi條件 if condition then action el...
Shell流程控制
case迴圈 if condition condition then statements if true 1 elif condition condition then statements if true 2 else statements if all else fails fi注 方括號中的...