條件判斷
1.按照文件類型進行判斷
測試選項 |
作用 |
-b 文件 |
判斷該文件是否存在,並且是否爲塊設備文件(是塊設備文件則爲真) |
-c 文件 |
判斷文件是否存在,並且是否爲字符設備文件(是字符設備文件爲真) |
-d 文件 |
判斷文件是否存在,並且是否爲目錄文件(是目錄則爲真) |
-e 文件 |
判斷文件是否存在(存在爲真) |
-f 文件 |
判斷文件是否存在,並且是否爲普通文件(是普通文件則爲真) |
-L 文件 |
判斷文件是否存在,並且是否爲符號鏈接文件(是符號鏈接文件爲真) |
-p 文件 |
判斷文件是否存在,並且是否爲管道文件(是管道文件則爲真) |
-s 文件 |
判斷文件是否存在,並且是否爲空(非空爲真) |
-S 文件 |
判斷文件是否存在,且是否爲套接字文件(是套接字文件爲真) |
判斷式有兩種格式(通常使用後一種):
test -e /etc/profile
[ -e /etc/profile ](中括號和條件判斷式之間一定要有空格!)
例如,執行:
[ -e /etc/profile ] && echo yes || echo no
執行結果爲 yes
2.按文件權限判斷
測試選項 |
作用 |
-r 文件 |
文件存在且擁有讀權限爲真 |
-w 文件 |
文件存在且有寫權限爲真 |
-x 文件 |
文件存在且擁有執行權限爲真 |
-u 文件 |
文件存在且擁有SUID權限爲真 |
-g 文件 |
文件存在且擁有SGID權限爲真 |
-k 文件 |
文件存在且擁有SBIT權限爲真 |
例如執行:
[ -w /etc/profile ] && echo yes || echo no結果爲yes
這裏要注意:權限測試並不區分是哪一個用戶的權限,只要存在一個用戶有相應的權限即爲真。
3.比較兩個文件
測試選項 |
作用 |
文件1 -nt文件2 |
判斷文件1的修改時間是否比文件2新(新,則爲真) |
文件1 -ot文件2 |
判斷文件1的修改時間是否比文件2舊(舊,則爲真) |
文件1 -ef文件2 |
判斷文件1是否和文件2的lnode號一致,可以理解爲判斷兩個文件是否爲同一個文件。這個判斷可用於判斷硬鏈接。 |
例如,執行:
ln /home/hunan/student.txt /home/hunan/bin/stu.txt
[ /home/hunan/student.txt -ef /home/hunan/bin/stu.txt ] && echoyes || echo no
上述命令先是創建了一個硬鏈接,然後判斷指向的文件是否相同,結果爲:yes
4.比較兩個整數
測試選項 |
作用 |
整數1 -eq整數2 |
整數1等於整數2爲真 |
整數1 -ne整數2 |
整數1不等於整數2爲真 |
整數1 -gt整數2 |
整數1大於整數2爲真 |
整數1 -lt整數2 |
整數1小於整數2爲真 |
整數1 -ge整數2 |
整數1大於等於整數2爲真 |
整數1 -le整數2 |
整數1小於等於整數2爲真 |
例如,執行:
$[ 23 -gt 22 ] && echo yes || echo no
yes
$[ 23 -lt 22 ] && echo yes || echo no
no
5.比較兩個字符串
測試選項 |
作用 |
-z 字符串 |
字符串爲空返回真 |
-n 字符串 |
字符串非空返回真 |
字符串1==字符串2 |
字符串1和字符串2相等返回真 |
字符串1!=字符串2 |
字符串1和字符串2不相等返回真 |
例如,執行:
$name=mike
$[ -z $name ] && echo yes || echo no
no
$[ $name == mike ] && echo yes || echo no
yes
6.shell中的與,或,非
測試選項 |
作用 |
判斷式1 -a判斷式2 |
邏輯與 |
判斷式1 -o判斷式2 |
邏輯或 |
! 判斷式 |
邏輯非 |
例如,執行:
$aa=11
$[ -n $aa -a "$aa" -gt 22 ] && echo yes || echo no
no
控制流程
1.單分支if條件語句
if [ 條件判斷式 ];then
程序
fi
或者
if [ 條件判斷式 ]
then
程序
fi
注意:
1.要記得以fi結尾/2.條件判斷式和中括號之間必須有空格/3.如果then和if在同一行要以 ; 分隔。
示例1:判斷當前用戶是否爲root用戶。思路:用env輸出所有環境變量,用grep提取出USER變量,用cut將USER=XXX以“=”爲分隔符切分,取切分後的第二個字符串即爲當前用戶名。命令之間以管道連接。
腳本內容:
#!/bin/bash
#提取出用戶名賦值給test變量
test=$(env| grep USER | cut -d "=" -f 2)
if [ $test == "root" ];then
<span style="white-space:pre"> </span>echo "this is root login."
fi
注意:要給腳本執行權限才能執行(chmoda+x *.sh)。
示例2:判斷分區使用率。當根分區使用率大於某一閾值,給出警告。思路:
df -h | grep sda4 | awk '{print $5}'| cut -d "%" -f 1
df -h打印分區信息,我這裏的根分區掛在在sda4,用grep過濾出這一行,用awk打印出第五部分,在用cut切掉%號。即可得到使用率數值。
腳本內容:
#!/bin/bash
#提取出當前根分區的使用率
test=$(df -h | grep sda4 | awk '{print $5}' | cut -d "%" -f 1)
if [ "$test" -gt 30 ];then
echo "/ is full!"
fi
(這裏爲了體現程序作用,閾值取30%.)
2.雙分支if語句
if[條件判斷式 ]
then
條件成立時執行語句
else
條件不成立時執行語句
fi
示例3:用戶輸入一個路徑,程序判斷是否爲一個目錄。思路:用read命令讀取用戶輸入,用-d判斷是否爲目錄。
腳本內容:
#!/bin/bash
read -t 30 -p "請輸入路徑:" path
if [ -d $path ];then
echo "is directory!"
else
echo "not directory!"
fi
示例4:判斷apache服務是否啓動。思路:用psaux列出所有進程,過濾出含有httpd但是不含grep的進程(因爲grephttpd命令也會產生一個含有httpd的進程)
腳本內容:
#!/bin/bash
test=$(ps aux | grep httpd | grep -v grep)
#如果字符串不爲空
if [ -n $test ]
then
echo “$(date) httpd is ok” >> /tmp/autostart-acc.log
else
echo “$(date) restart httpd !!” >> /tmp/autostart-err.log
/etc/rc.d/init.d/httpd start
fi
注意:這種方法,腳本名中不能含有httpd!
3.多分支if語句
if [ 條件判斷式1 ]
then
當條件判斷式1成立,執行語句
elif [ 條件判斷式2 ]
then
當條件判斷式2成立,執行語句
. . . 省略 . . .
else
當所有條件判斷式都不成立,執行語句
fi
示例5:判斷輸入的文件類型
腳本內容:
#!/bin/bash
#讀入用戶輸入的路徑
read -t 30 -p 請輸入路徑名: path
if [ -z $path ]
then
echo 請輸入路徑。
exit 1
elif [ ! -e $path ]
then
echo 您輸入的路徑不存在!
exit 2
elif [ -f $path ]
then
echo 您輸入的是普通文件。
elif [ -d $path ]
then
echo 您輸入的是目錄。
else
echo 您輸入的是其它文件。
fi
4.多分支case語句
case $變量名 in
“值1”)
如果變量的值等於值1,則執行程序1
;;
“值2”)
如果變量的值等於值2,則執行程序2
;;
. . . 省略其它分支 . . .
*)
如果變量的值都不是以上的值,則執行此程序
;;
esac
注意:每次選擇之後都要加上“雙分號”!除了最後的*其它的值都要被雙引號引起來。
示例6:根據用戶輸入做出不同反應。
#!/bin/bash
read -t 30 -p '請輸入你的選擇 yes/no:' cho
case $cho in
"yes")
echo 你的選擇是yes
;;
"no")
echo 你的選擇是no
;;
*)
echo 你的選擇是其它。
;;
esac
5.for循環
語法1:
for 變量 in 值1 值2 值3...
do
程序
done
示例7:循環打印數字
#!/bin/bash
for i in 1 2 3 4 5
do
echo $i
done
示例8:批量解壓縮
#!/bin/bash
cd /root/test
for i in $(ls *.tar.gz *.gz)
do
tar -zxf $i
done
語法2:
for ((初始值; 循環空值條件; 變量變化))
do
程序
done
示例9:計算1+2+...+100
#!/bin/bash
s=0
for ((i=1; i<=100; i=i+1))
do
s=$(($s+$i))
done
echo $s
6.while循環
while [ 條件判斷式 ]
do
程序
done
示例10:用while循環計算1+2+...+100
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$(($i+$s))
i=$(($i+1))
done
echo "the sum is:"$s
7.until循環
until循環和while循環相反,until循環時只要條件判斷式不成立則繼續循環,一旦條件判斷式成立則停止循環。
until [ 條件判斷式 ]
do
程序
done
示例11:用until循環計算1+2+...+100
#!/bin/bash
s=0
i=1
until [ $i -gt 100 ]
do
s=$(($s+$i))
i=$(($i+1))
done
echo 'the sum is:'$s