1. 程式人生 > >15Shell腳本—流程控制

15Shell腳本—流程控制

商品 輸出 用戶 名單 也不能 total bash ssh 有用

流程控制語句

盡管可以通過使用Linux命令、管道符、重定向以及條件測試語句編寫最基本的Shell腳本,但是這種腳本並不適用於生產環境。原因是它不能根據真實的工作需求來調整具體的執行命令,也不能根據某些條件實現自動循環執行。

例如,我們需要批量創建 1000 為用戶,首先要判斷這些用戶是否已經存在;若不存在,則通過循環語句讓腳本一次創建他們。

常用的有if、for、while、case這4種流程控制語句。

  1. 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
  1. for條件循環語句

    for 變量名 in 取值列表
    do
    命令序列
    done

下面使用for循環語句從列表文件中讀取多個用戶名,然後為其逐一創建用戶賬號並設置密碼。

首先創建用戶名稱列表,每個用戶名單獨一行。

[root@rockman 0619]# vim users.txt
[root@rockman 0619]# cat users.txt
bob
lily

然後編寫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"
fi
fi
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
  1. while條件循環語句

    while 條件測試操作
    do
    命令序列
    done

編寫Shell腳本。

[root@localhost 0619]# cat Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品實際價格為0-999之間,猜猜看是多少?"
while true
do
read -p "請輸入您猜測的價格數目:" INT
let TIMES++
if [ $INT -eq $PRICE ]; then
echo "恭喜你答對了,實際價格是 $PRICE"
echo "您共猜測了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ]; then
echo "太高了!"
else
echo "太低了!"
fi
done

運行shell腳本

[root@localhost 0619]# bash Guess.sh
商品實際價格為0-999之間,猜猜看是多少?
請輸入您猜測的價格數目:555
太高了!
請輸入您猜測的價格數目:333
太高了!
請輸入您猜測的價格數目:222
太低了!
請輸入您猜測的價格數目:300
太高了!
請輸入您猜測的價格數目:255
太高了!
請輸入您猜測的價格數目:244
太低了!
請輸入您猜測的價格數目:250
太高了!
請輸入您猜測的價格數目:247
太高了!
請輸入您猜測的價格數目:246
恭喜你答對了,實際價格是 246
您共猜測了 9 次
  1. case條件測試語句(略)

15Shell腳本—流程控制