按照測試物件來劃分,條件測試語句分爲4種:
檔案測試語句
邏輯測試語句
整數值比較語句
字串比較語句
運算子 | 作用 |
---|---|
- d | 測試檔案是否爲目錄型 |
- e | 測試檔案是否存在 |
- f | 判斷是否爲一般檔案 |
- r | 測試當前使用者是否有許可權讀取 |
- w | 測試當前使用者是否有許可權寫入 |
- x | 測試當前使用者是否有許可權執行 |
E.g
用檔案測試語句判斷 /etc/fstab是否爲一般檔案,如果返回值爲0,則代表檔案存在,且爲一般檔案,非0,則代表檔案不存在
[xxx]# [ -f /etc/fstab ]
[xxx]# echo $?
0
邏輯符號
&& 代表當前的命令執行成功後纔會執行它後面的命令
|| 代表當前面的命令執行失敗後纔會執行它後面的命令
! 代表「非」,取返值
以下 [xxx] 代表 root 賬戶 [xyz] 代表普通使用者
E.g
[xxx]# [ -e /dev/cdrom ] && echo 「Exist」
Exist
E.g
[xxx]# echo $USER
root
若賬戶不是超級賬戶,則返回值爲空
[xxx]# [ $USER = root ] || echo 「user」
[xxx]# su - xyz
[xyz]# $ [ $USER = root ] || echo 「user」
user
E.g
[xxx]# [! $USER = root ] || echo 「admin」
admin
E.g
[xxx]# [ ! $USER = root ] && echo 「user」 || echo 「root」
root
可用的整數比較運算子
運算子 | 作用 |
---|---|
-eq | 是否等於 |
-ne | 是否不等於 |
-gt | 是否大於 |
-lt | 是否小於 |
-le | 是否小於或等於 |
-ge | 是否大於或等於 |
E.g
[xxx]# [ 10 -gt 10 ]
[xxx]# echo $?
1
[xxx]# [ 10 -eq 10 ]
[xxx]# echo $?
0
E.g
[xxx]# free -m
total used free shared buffers cached
Mem: 3939 941 2998 9 1 295
-/+ buffers/cache: 644 3295
Swap: 2047 0 2047
[xxx]# free -m | grep Mem:
Mem: 3939 938 3000 9 1 295
[xxx]# free -m | grep Mem: | awk ‘{print $4}’
3000
[xxxp]# FreeMem=free -m | grep Mem: | awk '{print $4}'
[xxx]# echo $FreeMem
2998
E.g
[xxx]# [ $FreeMem -lt 1024 ] && echo 「Insufiicient Memory」
[xxx]# [ $FreeMem -lt 1024 ] || echo 「sufiicient Memory」
sufiicient Memory
運算子 | 作用 |
---|---|
= | 比較字串內容是否相同 |
!= | 比較字串內容是否不同 |
-z | 判斷字串內容是否爲空 |
E.g
[xxx]# [ -z $String ]
[xxx]# echo $?
0
E.g
[xxx]# echo $LANG
en_US.utf8
[xxx]# [ $LANG != 「en.US」 ] && echo 「Not en.US」
流程控制語句
if條件測試語句
if 條件測試操作
then 命令序列
fi
用 if 判斷 /media/cdrom 檔案是否存在,若存在就結束條件判斷和整個Shell指令碼,繁殖則去建立這個目錄
[xxx]$ ls -d /media/cdrom
ls: cannot access /media/cdrom: No such file or directory
[xxx]# vim mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
[xxx]# bash mkcdrom.sh
[xxx]# ls -d /media/cdrom
/media/cdrom
雙分支if tiaojianju
if 條件測試操作
then 命令序列1
else 命令序列2
fi
E.g
注:
-c 參數來規定常熟的次數
-i 參數定義每個數據包的發送間隔
-w 參數定義等待超時時間
/dev/null 是一個被稱作Linux黑洞的檔案,把資訊重定向到這個檔案等同於刪除數據(類似沒有回收功能的垃圾箱),可以讓使用者的螢幕視窗儲存簡潔
[xxx]# 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
[xxx]# bash chkhost.sh 192.168.10.10
ping: unknown host $
chkhost.sh: line 3: [: eq: binary operator expected
Host 192.168.10.10 is off-line
if 條件語句多分支
if 條件測試操作1
then 命令序列1
elif 條件測試操作2
then 命令序列2
else
命令序列3
fi
E.g
注: -p 參數用於向使用者顯示一定的提示資訊
#!/bin/bash
read -p 「Enter your score (0-100):」 GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo 「GRADE is Excelllent」
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo 「GRADE is Pass」
else
echo 「GRADE is Fail」
fi
[xxx]# bash chkscore.sh
Enter your score (0-100):86
GRADE is Excelllent
[xxx]# bash chkscore.sh
Enter your score (0-100):66
GRADE is Fail
[xxx]# bash chkscore.sh
Enter your score (0-100):200
GRADE is Fail
for 條件回圈語句
for 變數名 in 取值列表
do
命令序列
done
[xxx]# vim Example.sh
andy
barry
carl
duke
eric
george
[xxx]# vim users.txt
#!/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 KaTeX parse error: Expected 'EOF', got '&' at position 7: UNAME &̲> /dev/null
ech…PASSWD」 | passwd --stdin $UNAME &> /dev/null
if [ UNAME, Create success"
else
echo 「$UNAME, Creat failure」
fi
fi
done
[xxx]# bash Example.sh
Enter The Users Password : test
Already exists
Already exists
Already exists
Already exists
Already exists
Already exists
While 條件回圈語句
通過條件測試的真假來決定是否繼續執行命令,若條件爲真就繼續執行,爲假就結束回圈
while 條件測試操作
do
命令序列
done
E.g
[xxx]# vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo 「Price bwteen 0-999,please guess」
while true
do
read -p "Please input the price: " INT
let TIMES++
if [ $INT -eq $PRICE ]; then
echo 「Congratulation, the price is $PRICE」
echo 「You guess totally $TIMES times」
exit 0
elif [ $INT -gt $PRICE ] ; then
echo 「Too high!」
else
echo 「Too low!」
fi
done
[xxx]# bash Guess.sh
Price bwteen 0-999,please guess
Please input the price: 800
Too high!
Please input the price: 400
Too high!
Please input the price: 200
Congratulation, the price is 200
You guess totally 3 times
Case 條件測試語句
Case 變數值 in
模式1)
命令序列1
;;
模式1)
命令序列2
;;
*)
預設命令序列
esac
E.g
[xxx]# vim Checkkeys.sh
#!/bin/bash
read -p "Please input a Character and confirm by Enter button: " KEY
case 「$KEY」 in
[a-z] | [A-Z])
echo 「Your input is Character」
;;
[0-9])
echo 「Your input is number」
;;
*)
echo 「Your input is space or function or other control character」
esac
[xxx]# bash Checkkeys.sh
Please input a Character and confirm by Enter button: a
Your input is Character
[xxx]# bash Checkkeys.sh
Please input a Character and confirm by Enter button: 8
Your input is number
[xxx]# bash Checkkeys.sh
Please input a Character and confirm by Enter button: %
Your input is space or function or other control character
計劃任務服務程式
一次性計劃任務只執行一次,一般用於滿足臨時的工作需求
可以用 at 命令實現這種功能
at -l 檢視已設定好但還未執行的一次性計劃任務
atrm 將其刪除
[xxx]# vim Checkkeys.sh
[xxx]# at 13:30
at> systemctl restart httpd
at> (此處是需要Ctrl+d 組合鍵完成)
job 1 at Thu Aug 13 13:30:00 2020
[xxx]# at -l
1 Thu Aug 13 13:30:00 2020 a root
[xxx]# echo 「systemctl restart httpd」 | at 13:30
job 2 at Thu Aug 13 13:30:00 2020
[xxx]# at -l
1 Thu Aug 13 13:30:00 2020 a root
2 Thu Aug 13 13:30:00 2020 a root
[xxx]# atrm 1
[xxx]# at -l
2 Thu Aug 13 13:30:00 2020 a root
Crond 週期性地、有規律地執行某些具體任務
crontab -e 建立、編輯計劃任務
crontab -l 檢視當前計劃任務
crontab -r 刪除某條計劃任務
crontab -u 編輯他人的計劃任務
使用crond設定任務的參數格式
分、時、日、月、星期
欄位 | 說明 |
---|---|
分 | 取值爲0-59的整數 |
時 | 取值爲0-23的任意整數 |
日 | 取值爲1-31的任意整數 |
月 | 取值爲1-12的任意整數 |
星期 | 取值爲0-7的任意整數,其中0與7均爲星期日 |
命令 | 要執行的命令或程式指令碼 |
[xxx]# crontab -e
[xxx]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot