20.5-20.9 shel:l腳本中的邏輯判斷,文件目錄屬性判斷,if特殊用法 ,case判斷
不帶else
格式1:if 條件 ; then 語句; fi(這種格式常用)
解釋:如果滿足條件,然後怎樣,最後怎樣
實例:
1 命令行形式表示
[root@AliKvn ~]# a=5
[root@AliKvn ~]# if [ $a -gt 3 ]
> then
> echo ok
> fi
ok
[root@AliKvn ~]# if [ $a -gt 3 ]; then echo ok; fi
解釋:
-gt 3 表示大於3
整條參數的意思就是,如果a大於3,顯示ok.
上面2條參數都是同樣效果,分開寫就用上面的格式,一條命令的格式就參考下面的。
2 腳本形式表示
編寫腳本
[root@AliKvn shell]# vim if1.sh
#!/bin/bash
a=5
if [ $a -gt 3 ]
then
echo ok
fi
執行
[root@AliKvn shell]# sh if1.sh
ok
帶有else,表示否則。
格式2:if 條件; then 語句; else 語句; fi
解釋:如果滿足條件,然後怎樣;如果不滿足條件,然後怎樣。
實例:
1 編寫腳本
a=1,大於3就ok,否則,no.
[root@AliKvn shell]# vim if2.sh
#!/bin/bash
a=1
if [ $a -gt 3 ]
then
echo ok
else
echo no
fi
2 執行過程
[root@AliKvn shell]# sh -x if2.sh
+ a=1 a=1
+ '[' 1 -gt 3 ']' 1與3比較,不滿足>3條件,
+ echo no 但是滿足腳本中的else
no 所以最後輸出結果是no
帶有elif,附件條件,同個腳本可以寫多個elif
格式3:if …; then … ;elif …; then …; else …; fi
解釋:
實例:
1 編寫腳本
[root@AliKvn shell]# vim if3.sh
#!/bin/bash
a=3
if [ $a -gt 4 ]
then
echo ">1"
elif [$a -gt 6]
then
echo "<6 && >1"
else
echo no
fi
參數解釋:
elif [$a -gt 6] 而且a>6,
then
echo "<6 && >1" 則輸出結果:<6 && >1
2 執行過程
[root@AliKvn shell]# sh -x if3.sh
+ a=3
+ '[' 3 -gt 4 ']'
+ '[' 3 -gt 6 ']'
+ echo no
no
邏輯判斷表達式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等
大於小於等於等說明:-gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 註意到處都是空格
大於小於等於也可以用這種方法表示,
[root@AliKvn shell]# a=3
[root@AliKvn shell]# if ((a>1)); then echo ok; fi
ok
可以使用 && || 結合多個條件(&&並且,||或者)
if [ $a -gt 5 ] && [ $a -lt 10 ]; then
if [ $b -gt 5 ] || [ $b -lt 3 ]; then
20.6 文件目錄屬性判斷
[ -f file ]判斷是否是普通文件,且存在
實驗
1 編寫腳本
[root@AliKvn shell]# !vim
vim file-f.sh
#!/bin/bash
f="/tmp/shell-f.test"
if [ -f $f ]
then
echo $f exist.
else
touch $f
fi
解釋:
f="/tmp/shell-f.test" 變量f=/tmp/shell-f.test這個文件,
if [ -f $f ] 如果它是個文件,
then 則
echo $f exist. 輸出$f變量exist
else 否則
touch $f 創建$f文件
fi
2 執行腳本查看進度
[root@AliKvn shell]# sh -x file-f.sh
+ f=/tmp/shell-f.test
+ '[' -f /tmp/shell-f.test ']'
+ echo /tmp/shell-f.test exist.
/tmp/shell-f.test exist.
[ -d file ] 判斷是否是目錄,且存在
編寫腳本
[root@AliKvn shell]# vim file-d.sh
#!/bin/bash
f="/tmp/shell-f.test"
if [ -d $f ]
then
echo $f exist.
else
touch $f
fi
解釋:
if [ -d $f ] -d判斷變量$f是否目錄
touch $f 目錄和文件都可以進行touch的。touch$f,如果存在,也不影響操作,只影響time
2 執行腳本查看進度
[root@AliKvn shell]# sh -x file-d.sh
+ f=/tmp/shell-f.test
+ '[' -d /tmp/shell-f.test ']'
+ touch /tmp/shell-f.test
[ -e file ] 判斷文件或目錄是否存在,僅僅判斷是否存在
1 編寫腳本,
[root@AliKvn shell]# !vim
vim file-d.sh
#!/bin/bash
f="/tmp/shell-f.test"
if [ -e $f ]
then
echo $f exist.
else
touch $f
fi
2 執行腳本查看進度
[root@AliKvn shell]# sh -x !$
sh -x file-d.sh
+ f=/tmp/shell-f.test
+ '[' -e /tmp/shell-f.test ']'
+ echo /tmp/shell-f.test exist.
/tmp/shell-f.test exist.
[ -r file ] 判斷文件是否可讀
1 編寫腳本
[root@AliKvn shell]# !vim
vim file-d.sh
#!/bin/bash
f="/tmp/shell-f.test"
if [ -r $f ]
then
echo $f readable
else
echo $f unreadable
fi
2 執行腳本
[root@AliKvn shell]# sh file-d.sh
/tmp/shell-f.test readable
[ -w file ] 判斷文件是否可寫
[root@AliKvn shell]# !vim
vim file-d.sh
#!/bin/bash
f="/tmp/shell-f.test"
if [ -r $f ]
then
echo $f writeable
else
echo $f unwriteable
fi
2 執行腳本
[root@AliKvn shell]# sh file-d.sh
/tmp/shell-f.test writeable
[ -e file ] 判斷文件或目錄是否存在
註意,執行判斷腳本的可讀可寫可執行狀態,只針對當前用戶
#vim file-d.sh
#!/bin/bash
f="/tmp/shell-f.test"
if [ -r $f ]
then
echo $f writeable
else
echo $f unwriteable
fi
[root@AliKvn shell]# !vim
vim file-d.sh
#!/bin/bash
f="/tmp/shell-f.test"
if [ -f $f ]
then
rm -f $f
fi
以上腳本,倒數4條的內容,等同於這條參數[ -f $f ] && rm -f $f
&&表示前面的執行有效,後面才接著執行。
[ -f $f ] || touch $f
||表示或者,前者命令是否定答案,才執行後者命令。
以上都是用了如果存在的條件,
要表示如果文件不存在,應該是[! -f $f] !表示非,取反,否定意義。
總結:
if 判斷文件、目錄屬性
[ -f file ]判斷是否是普通文件,且存在
[ -d file ] 判斷是否是目錄,且存在
[ -e file ] 判斷文件或目錄是否存在
[ -r file ] 判斷文件是否可讀
[ -w file ] 判斷文件是否可寫
[ -x file ] 判斷文件是否可執行
20.7 if特殊用法
if判斷的一些特殊用法
if [ -z "$a" ] 這個表示當變量a的值為空時會怎麽樣。它與if [ -n "$a" ]是相對的,相反的。if [ -n "$a" ]=if [ ! -z "$a" ],他們是相同的。
1 編寫腳本,
[root@AliKvn shell]# vim shell20-7.sh
#!/bin/bash
n=`wc -l /tmp/lalal` n的值為統計文件的行數
if [ -z "$n" ] 如果n的值為空(或者文件是不存在)
then 則
echo error 輸出error
exit 然後退出
elif [ $n -gt 1000 ] 如果輸出結果大於1000
then 則
echo ljfiwo 輸出ljfiwo
fi
2 執行腳本並輸出,略亂
[root@AliKvn shell]# sh -x shell20-7.sh
++ wc -l /tmp/lalal
wc: /tmp/lalal: No such file or directory
+ n=
+ '[' -z '' ']'
+ echo error
error
+ exit
3 這個腳本還可以更完美
[root@AliKvn shell]# !vim
vim file-f.sh
#!/bin/bash
if [ ! -f /tmp/lalal ] 判斷/tmp/lalal是否非文件並判斷是否非存在,
then 條件成立則
echo "/tmp/lalal not exist." 輸出結果
exit 退出操作
fi 結束
f="/tmp/shell-f.test"
if [ -f $f ]
then
echo $f exist.
else
touch $f
fi
4 執行腳本
[root@AliKvn shell]# !vim
vim file-f.sh
[root@AliKvn shell]# sh -x !$
sh -x file-f.sh
+ '[' '!' -f /tmp/lalal ']'
+ echo '/tmp/lalal not exist.'
/tmp/lalal not exist.
+ exit
[root@AliKvn shell]# sh file-f.sh
/tmp/lalal not exist.
if [ -n "$a" ] 表示當變量a的值不為空。可以判斷文件,如果是字符串需要用雙引號引起,否則不用雙引號。
1 判斷文件用法(不用雙引號標註)
判斷01.sh是否存在
[root@AliKvn shell]# ls
01.sh file-d.sh file-f.sh if1.sh if2.sh if3.sh shell20-7.sh
如果01.sh存在,那麽輸出yes
[root@AliKvn shell]# if [ -n 01.sh ]; then echo yes; fi
yes
2 判斷變量用法(需要雙引號標註)
[root@AliKvn ~]# echo $b
[root@AliKvn ~]# if [ -n "$b" ]; then echo $b; else echo "b is not here"; fi
b is not here
命令的執行結果作為判斷條件
1 判斷系統中是否有mysql用戶存在
解決思路:mysql——》/etc/passwd——》grep ——》再執行條件判斷
[root@AliKvn ~]# if grep -wq 'mysql' /etc/passwd; then echo "exist"; fi
exist
如果mysql1用戶不存在,判斷條件
[root@AliKvn ~]# if ! grep -wq 'mysql1' /etc/passwd; then echo "don't exist"; fi
don't exist
如果mysql1用戶不存在,判斷條件
[root@AliKvn ~]# if grep -wq 'mysql1' /etc/passwd; then echo "exist";else echo " don't exist "; fi
don't exist
以上兩種方法的性質是一樣的
同理
if [ ! -e file ]; then 表示文件不存在時會怎麽樣
if (($a<1)); then …等同於 if [ $a -lt 1 ]; then...
[ ] 中不能使用<,>,==,!=,>=,<=這樣的符號(=是賦值,==是等於)
20.8 case判斷
shell中的case判斷
在shell腳本中,除了用if來判斷邏輯外,還有一種常用的方式,case.
case腳本常用於偏寫系統服務的啟動腳本。例如/etc/init.d/network中就用到了case
格式:
case 變量名 in
value1) 值為value1的時候
command 執行什麽
;; ;;表示一個判斷結束,進入到下一個判斷。
value2) 值為value2的時候
command 執行什麽
;;
*) 除此之外
command 又執行什麽
;;
esac case的倒寫,表示到此結束case腳本
在case程序中,可以在條件中使用|,表示或的意思, 比如
2|3)
command
;;
腳本案例
目的,讓用戶輸入數值,然後用腳本判斷數值的範圍。
例如這個數字一個考試分數值,範圍是0-100,然後再在0-100裏面定義分數的級別:不合格,合格,優秀。
1 創建並編輯腳本
[root@AliKvn shell]# cd /root/shell/
[root@AliKvn shell]# vim sh-case-test.sh
#!/bin/bash
read -p "Please input a number: " n
if [ -z "$n" ]
then
echo "Please input a number."
exit 1
fi
n1=`echo $n|sed 's/[0-9]//g'`
if [ -n "$n1" ]
then
echo "Please input a number."
exit 1
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
case $tag in
1)
echo "no pass"
;;
2)
echo "pass"
;;
3)
echo "good"
;;
4)
echo "very good"
;;
*)
echo "The number range is 0-100."
;;
esac
參數解釋:(解釋比較長)
#!/bin/bash
read -p "Please input a number: " n 讓用戶輸入字符串,其實這算與用戶交互動作。
例如,read -p "xxx" n 顯示的結果就是xxx:
那麽read -p "Please input a number: " n
輸出是Please input a number:
[root@AliKvn ~]# read -p "Please input a number: " n
Please input a number: 100
[root@AliKvn ~]# echo $n
100
if [ -z "$n" ] 如果n值為空,即用戶沒有輸入n值
then 則
echo "Please input a number." 輸出告知Please input a number.
exit 1 退出,並返回1個數值,這裏的用法跟echo $?的輸出一樣
fi
n1=`echo $n|sed 's/[0-9]//g'` 判斷變量n1輸入的值是否純數字,是純數字的話,sed功能會將其解析置空(這裏的置空僅僅用於命令條件作用,並不是把n值置空),置空的話下面的條件不成立(if,if為一對)
if [ -n "$n1" ] 當n1數值不為空時(註意,這裏不是n值是n1,兩者性質不同),會被當作輸出不合法
then
echo "Please input a number." 繼續輸出Please input a number.
exit 1 如果n1不為空的話,退出這條件,然後繼續判斷其他條件
fi
那就是說,當用戶輸入的字符串(n值)為純數字的話,條件成立(n1置空)。否則,用戶輸入的不是純數字的話,條件不成立,被腳本認為是不合法輸入,會繼續輸出Please input a number.
if [ $n -lt 60 ] && [ $n -ge 0 ] 條件能到這裏,表示n是一個純數字。當0<n<60
then 則
tag=1 轉到標記1
elif [ $n -ge 60 ] && [ $n -lt 80 ] 當60<n<80
then 則
tag=2 轉到標記2
elif [ $n -ge 80 ] && [ $n -lt 90 ] 當80<n<90
then 然後
tag=3 轉到標記3
elif [ $n -ge 90 ] && [ $n -le 100 ] 當90<n<=100
then 然後
tag=4 轉到標記4
else 否則
tag=0 轉到標記0
fi
case $tag in
1) 標記1(tag=1)
echo "no pass" 輸出no pass
;;
2) 標記2
echo "pass" 輸出pass
;;
3) 標記3
echo "good" 輸出good
;;
4) 標記4
echo "very good" very good
;;
*) 以上4個標記都不符合的條件,這時候數值是等於0,又可能是大於100
echo "The number range is 0-100." 輸出The number range is 0-100. 提示用戶輸入正確的數值
;;
esac 結束腳本
3 測試腳本
[root@AliKvn shell]# sh sh-case-test.sh
Please input a number: 111
The number range is 0-100.
超過定義的範圍100以外的數值,所以條件不成立,然後輸出了不成立的信息,此處證明腳本的否定輸出是ok的。
3.1 查看執行過程
[root@AliKvn shell]# sh -x sh-case-test.sh
+ read -p 'Please input a number: ' n
Please input a number: 111
+ '[' -z 111 ']'
++ sed 's/[0-9]//g'
++ echo 111
+ n1=
+ '[' -n '' ']'
+ '[' 111 -lt 60 ']'
+ '[' 111 -ge 60 ']'
+ '[' 111 -lt 80 ']'
+ '[' 111 -ge 80 ']'
+ '[' 111 -lt 90 ']'
+ '[' 111 -ge 90 ']'
+ '[' 111 -le 100 ']'
+ tag=0
+ case $tag in
+ echo 'The number range is 0-100.'
The number range is 0-100.
3.2 輸入不合法的數值數值,例如中英文。
[root@AliKvn shell]# sh sh-case-test.sh
Please input a number: ah1
Please input a number.
執行過程
[root@AliKvn shell]# sh -x sh-case-test.sh
+ read -p 'Please input a number: ' n
Please input a number: ah1
+ '[' -z ah1 ']'
++ sed 's/[0-9]//g'
++ echo ah1
+ n1=ah
+ '[' -n ah ']'
+ echo 'Please input a number.'
Please input a number.
+ exit 1
3.3 正確的範圍輸出結果
[root@AliKvn shell]# sh sh-case-test.sh
Please input a number: 60
pass
[root@AliKvn shell]# sh sh-case-test.sh
Please input a number: 88
good
[root@AliKvn shell]# sh sh-case-test.sh
Please input a number: 98
very good
[root@AliKvn shell]# sh sh-case-test.sh
Please input a number: 100
very good
完全符合剛剛定義的參數配置,成功。下面再看看執行腳本過程。
3.4 執行腳本過程
[root@AliKvn shell]# sh -x sh-case-test.sh
+ read -p 'Please input a number: ' n
Please input a number: 60
+ '[' -z 60 ']'
++ sed 's/[0-9]//g'
++ echo 60
+ n1=
+ '[' -n '' ']'
+ '[' 60 -lt 60 ']'
+ '[' 60 -ge 60 ']'
+ '[' 60 -lt 80 ']'
+ tag=2
+ case $tag in
+ echo pass
pass
[root@AliKvn shell]# sh -x sh-case-test.sh
+ read -p 'Please input a number: ' n
Please input a number: 88
+ '[' -z 88 ']'
++ sed 's/[0-9]//g'
++ echo 88
+ n1=
+ '[' -n '' ']'
+ '[' 88 -lt 60 ']'
+ '[' 88 -ge 60 ']'
+ '[' 88 -lt 80 ']'
+ '[' 88 -ge 80 ']'
+ '[' 88 -lt 90 ']'
+ tag=3
+ case $tag in
+ echo good
good
[root@AliKvn shell]# sh -x sh-case-test.sh
+ read -p 'Please input a number: ' n
Please input a number: 98
+ '[' -z 98 ']'
++ sed 's/[0-9]//g'
++ echo 98
+ n1=
+ '[' -n '' ']'
+ '[' 98 -lt 60 ']'
+ '[' 98 -ge 60 ']'
+ '[' 98 -lt 80 ']'
+ '[' 98 -ge 80 ']'
+ '[' 98 -lt 90 ']'
+ '[' 98 -ge 90 ']'
+ '[' 98 -le 100 ']'
+ tag=4
+ case $tag in
+ echo 'very good'
very good
[root@AliKvn shell]# sh -x sh-case-test.sh
+ read -p 'Please input a number: ' n
Please input a number: 100
+ '[' -z 100 ']'
++ sed 's/[0-9]//g'
++ echo 100
+ n1=
+ '[' -n '' ']'
+ '[' 100 -lt 60 ']'
+ '[' 100 -ge 60 ']'
+ '[' 100 -lt 80 ']'
+ '[' 100 -ge 80 ']'
+ '[' 100 -lt 90 ']'
+ '[' 100 -ge 90 ']'
+ '[' 100 -le 100 ']'
+ tag=4
+ case $tag in
+ echo 'very good'
very good
4 done.
20.5-20.9 shel:l腳本中的邏輯判斷,文件目錄屬性判斷,if特殊用法 ,case判斷