《Linux就該這麽學》第四章筆記
4.2.3 判斷用戶的參數
Shell腳本中的條件測試語法可以判斷表達式是否成立,若條件成立則返回數字0,否則便返回其他隨機數值。
&& 當前面的命令成立時,執行後面的語句;
|| 當前面個的命令不成立時,執行後main的語句;
! 表示把條件測試中的判斷結果取相反值;
*可用的整數比較運算符*
[root@linuxprobe ~]# [ 10 -gt 10 ] [root@linuxprobe ~]# echo $? 1 [root@linuxprobe ~]# [ `free -m | grep Mem: | awk '{print $4}'` -le 1024 ] && echo "Error" || echo "OK" OK
4.3 流程控制語句
4.3.1 if條件測試語句
[root@linuxprobe ~]# vim 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
[root@linuxprobe ~]# vim 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@linuxprobe ~]# bash chkscore.sh Enter your score(0-100):88 88 is Excellent [root@linuxprobe ~]# bash chkscore.sh Enter your score(0-100):80 80 is Pass
4.3.2 for條件循環語句
[root@linuxprobe ~]# vim Example.sh #!/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
註:/dev/null是一個被稱作Linux黑洞的文件,把輸出信息重定向到這個文件等同於刪除數據(類似於沒有回收功能的垃圾箱),可以讓用戶的屏幕窗口保持簡潔。
[root@linuxprobe ~]# vim 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@linuxprobe ~]# bash chkscore.sh Enter your score(0-100):88 88 is Excellent [root@linuxprobe ~]# bash chkscore.sh Enter your score(0-100):80 80 is Pass
4.3.2 for條件循環語句
[root@linuxprobe ~]# vim Example.sh #!/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
4.3.3 while條件循環語句
while條件循環語句:讓腳本根據某些條件來重復執行命令的語句,它的循環結構往往在執行前並不確定最終執行的次數;
for循環語句:用在有目標、有範圍的使用場景。
[root@linuxprobe ~]# vim Guess.sh #!/bin/bash PRICE=$(expr $RANDOM % 1000) TIMES=0 echo "商品實際價格為0-999之間,猜猜看是多少?" while truedo 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
expr 用於計算;
4.3.4 case條件測試語句
[root@linuxprobe ~]# vim Checkkeys.sh #!/bin/bash read -p "請輸入一個字符,並按Enter鍵確認:" KEY case "$KEY" in [a-z]|[A-Z]) echo "您輸入的是 字母。" ;; [0-9]) echo "您輸入的是 數字。" ;; *) echo "您輸入的是 空格、功能鍵或其他控制字符。" esac [root@linuxprobe ~]# bash Checkkeys.sh 請輸入一個字符,並按Enter鍵確認:6 您輸入的是 數字。 [root@linuxprobe ~]# bash Checkkeys.sh 請輸入一個字符,並按Enter鍵確認:p 您輸入的是 字母。 [root@linuxprobe ~]# bash Checkkeys.sh 請輸入一個字符,並按Enter鍵確認:^[[15~ 您輸入的是 空格、功能鍵或其他控制字符。
4.4 計劃任務服務程序
4.4.1 at命令
一次性計劃任務只執行一次,一般用於滿足臨時的工作需求。在使用at命令來設置一次性計劃任務時,默認采用的是交互式方法。
命令形式:at 時間;
"at -l”命令:查看已設置好但還未執行的一次性計劃任務;
“atrm 任務序號" :刪除計劃任務;
[root@linuxprobe ~]# echo "systemctl restart httpd" | at 23:30 job 4 at Mon Apr 27 23:30:00 2015 [root@linuxprobe ~]# at -l 3 Mon Apr 27 23:30:00 2016 a root 4 Mon Apr 27 23:30:00 2016 a root [root@linuxprobe ~]# atrm 3 #刪除job 3 [root@linuxprobe ~]# at -l 4 Mon Apr 27 23:30:00 2016 a root
4.4.2 crontab命令
crond服務設置任務的參數格式口訣“分、時、日、月、星期 命令”
*使用crond設置任務的參數字段說明*
字段 | 說明 |
分鐘 | 取值為0~59的整數 |
小時 | 取值為0~23的任意整數 |
日期 | 取值為1~31的任意整數 |
月份 | 取值為1~12的任意整數 |
星期 | 取值為0~7的任意整數,其中0與7均為星期日 |
命令 | 要執行的命令或程序腳本 |
[root@linuxprobe ~]# crontab -e #編輯新建任務,調用VIM編輯器進行任務編輯,可以使用#寫註釋 no crontab for root - using an empty one crontab: installing new crontab [root@linuxprobe ~]# crontab -l #查看 25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot [root@linuxprobe ~]# crontab -r #刪除任務
註:除了用逗號(,)來分別表示多個時間段,例如“8,9,12”表示8月、9月和12月。還可以用減號(-)來表示一段連續的時間周期(例如字段“日”的取值為“12-15”,則表示每月的12~15日)。以及用除號(/)表示執行任務的間隔時間(例如“*/2”表示每隔2分鐘執行一次任務)。
《Linux就該這麽學》第四章筆記