15Shell指令碼 流程控制

2022-09-07 06:21:08 字數 3936 閱讀 1376

流程控制語句

儘管可以通過使用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注 方括號中的...