十七週一次課linux
20.5shell邏輯判斷shell
20.6文件屬性判斷vim
20.7if特殊用法bash
20.8-20.9case判斷spa
20.5shell邏輯判斷文檔
在[ ]中括號中:字符串
在(( ))小括號中:
<,<=,==,!=,>,>=get
注意: 使用雙括號括起來input
[root@tianqi-01 ~]# for i in `seq 1 5`; do echo $i; done
1
2
3
4
5
[root@tianqi-01 ~]# it
有時候不用寫腳本,1條命令足矣。
[root@tianqi-01 ~]# for i in `seq 1 5`
> do
> echo $i
> done
1
2
3
4
5
[root@tianqi-01 ~]#
這條命令也能夠不用分割,效果相同。
if 條件 ;then commond;fi
[root@tianqi-01 ~]# a=5
[root@tianqi-01 ~]# if [ $a -gt 3 ]
> then
> echo ok
> fi
ok
[root@tianqi-01 ~]# if [ $a -gt 3 ]; then echo ok; fi
ok
[root@tianqi-01 ~]#
[root@tianqi-01 shell]# vim if1.sh
#!/bin/bash
a=5
if [ $a -gt 3 ]
then
echo "ok"
fi
[root@tianqi-01 shell]# sh if1.sh
ok
if 條件1;then commond1;else commond2;fi
[root@tianqi-01 shell]# vim if2.sh
#!/bin/bash
a=5
if [ $a -gt 3 ]
#注意[]內的空格
then
echo "ok"
else
echo "fault"
fi
[root@tianqi-01 shell]# sh if2.sh
ok
[root@tianqi-01 shell]# sh -x if2.sh
+ a=5
+ '[' 5 -gt 3 ']'
+ echo ok
ok
[root@tianqi-01 shell]#
if 條件1;then commond1;elif 條件2;then commond2;else commond3;fi
[root@tianqi-01 shell]# vim if3.sh
a=5
if [ $a -lt 3 ]
then
echo "a<3"
elif [ $a -gt 6 ]
then
echo "a>6"
else
echo "Out of the zone"
fi
[root@tianqi-01 shell]# sh if3.sh
Out of the zone
[root@tianqi-01 shell]# sh -x if3.sh
+ a=5
+ '[' 5 -lt 3 ']'
+ '[' 5 -gt 6 ']'
+ echo 'Out of the zone'
Out of the zone
[root@tianqi-01 shell]#
各個條件之間的關係可使用邏輯鏈接符:
條件A&&條件B:而且
條件A||條件B:或者
20.6文件屬性判斷
shell腳本中if常常用於判斷文檔的屬性,好比判斷是普通文件仍是目錄文件,判斷文件是否有讀、寫、執行權限等。if經常使用的選項有如下幾個:
-e:判斷文件或目錄是否存在
-d:判斷是否是目錄文件以及是否存在
-f:判斷是否是普通文件以及是否存在
-r:判斷是否有讀權限
-w:判斷是否有寫權限
-x:判斷是否有執行權限
若是某文件存在:
if [ -e filename ]
then
commond
fi
以上命令可簡化爲:
[ -e filename ] && commond
&&先後的命都執行
或:
[ -e filename ] || commond
當 || 前面的執行不成功時再執行後面的命令
若是某文件不存在:
if [ ! -e filename ]
then
commond
fi
「!」等同於取反。
[root@localhost shell]# vim file1.sh
#!/bin/bash
a="/tmp/aminglinux"
if [ -f $a ]
then
echo $a exist
else
touch $a
f
[root@localhost tmp]# sh -x file1.sh
+ a=/tmp/aminglinux
+ '[' -f /tmp/aminglinux ']'
+ touch /tmp/aminglinux
20.7if特殊用法
if [ -z "$a" ]:表示當變量a的值爲空時會怎樣
if [ -n "$a" ]:表示當變量a的值不爲空時會怎樣
-z和-n爲相反的兩個反條件。
[root@tianqi-01 shell]# vim if.sh
#!/bin/bash
n=`wc -l /tmp/test.txt`
if [ $n -gt 20 ]
then
echo 1
else
echo 0
fi
在該腳本中無語法錯誤,只是咱們預設/tmp/test.txt是存在的,若是該文件不存在,該腳本執行的時候就會報錯:
[root@tianqi-01 shell]# sh if.sh
wc: /tmp/test.txt: No such file or directory
if.sh: line 5: [: -gt: unary operator expected
if.sh: line 13: $'\302\240\302\240\302\240\302\240echo': command not found
[root@tianqi-01 shell]#
因此,爲了不這種錯誤的發生,須要將腳本寫的更加嚴謹,須要在執行「if [ $n -gt 20 ]」以前先確認文件「/tmp/test.txt」是否存在:
[root@tianqi-01 shell]# vim exit.sh
#!/bin/bash
n=`wc -l /tmp/test.txt`
if [ -z $n ]
then
echo "error"
exit
elif [ $n -lt 20 ]
then
echo 1
else
echo 0
fi
即,若是變量n爲空則顯示error並退出該腳本。
[root@tianqi-01 shell]# sh exit.sh
wc: /tmp/test.txt: No such file or directory
error
即,當該文件不存在的時候就會退出執行,不會提示存在語法錯誤。(該腳本存在邏輯錯誤,只作效果演示用)
注意: 在該表達式中引用變量時要用雙引號引發來。
判斷某參數存在:
[root@tianqi-01 shell]# vim exit1.sh
#!/bin/bash
if grep -wq 'user1' /etc/passwd
then
echo "user1 exit"
fi
[root@tianqi-01 shell]# sh exit1.sh
user1 exit
判斷某參數不存在
[root@tianqi-01 shell]# vim exit1.sh
#!/bin/bash
if ! grep -wq 'user1' /etc/passwd
then
echo "user1 exit"
fi
[root@tianqi-01 shell]# sh exit1.sh
說明: grep中-w選項=Word,表示過濾一個單詞;-q,表示不打印過濾的結果。判斷某參數不存在時使用!表示取反。
20.8-20.9case判斷
格式:
case 變量名 in
value1)
commond1
;;
value2)
commod2
;;
value3)
commod3
;;
*)
commod3
;;
esac
在case中,能夠在條件中使用「|」,表示或的意思,如:
2|3)
command
;;
[root@tianqi-01 shell]# vim case1.sh
#!/bin/bash
#判斷是否輸入有數值,空直接結束整個文本
read -p "Please input a number:" n
#read 讓用戶輸出一些字符串,賦值給最後一個變量,這裏的賦值是「n」
if [ -z "$n" ] //變量n爲空
then
echo "Please input a number."
exit 1
#「exit 1」表示執行該部分命令後的返回值 ,即,命令執行完後使用echo $?的值
fi
n1=`echo $n|sed 's/[0-9]//g'`
#判斷用戶輸入的字符是否爲純數字 ,若是是數字,則將其替換爲空,賦值給$n1
if [ -n "$n1" ]
then
echo "Please input a number."
exit 1
#判斷$n1不爲空時(即$n不是純數字)再次提示用戶輸入數字並退出
fi
if [ $n -lt 60 ] && [ $n -ge 0 ]
then
tag=1
elif [ $n -ge 60 ] && [ $n -lt 80 ]
then
tag=2
elif [ $n -ge 80 ] && [ $n -lt 90 ]
then
tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ]
then
tag=4
else
tag=0
fi
#tag的做用是爲判斷條件設定標籤,方便後面引用
case $tag in
1)
echo "not ok"
;;
2)
echo "ok"
;;
3)
echo "ook"
;;
4)
echo "oook"
;;
*)
echo "The number rang is 0-100."
;;
esac
說明: 該腳本的做用是輸入考試成績,判斷考試成績的等級。
[root@tianqi-01 shell]# sh case1.sh
Please input a number:95
oook
[root@tianqi-01 shell]# sh case1.sh
Please input a number:82
ook
[root@tianqi-01 shell]# sh case1.sh
Please input a number:63
ok
[root@tianqi-01 shell]# sh case1.sh
Please input a number:35
not ok
友情連接:阿銘linux