1. 程式人生 > >shell腳本中的邏輯判斷,文件目錄屬性判斷,if特殊用法,case判斷

shell腳本中的邏輯判斷,文件目錄屬性判斷,if特殊用法,case判斷

shell

shell中的邏輯判斷

格式1:if 條件 ; then 語句; fi
if是如果怎麽樣,then是則怎麽樣
寫一個簡單的腳本,它的意思是當a=5,當a大於3時打印ok
#!/bin/bash
a=5
if [ $a -gt 3 ]
then
echo ok
fi
保存退出後執行腳本
[root@linletao-001 shell]# sh if1.sh
ok
其中gt的在shell中的意義是大於的意思。這裏需要註意的是中括號中的空格,在兩邊和中間的都有空格。

格式2:if 條件; then 語句; else 語句; fi
它的意思是如果滿足怎麽樣,如果不滿足會怎麽樣。
#!/bin/bash
a=1
if [ $a -gt 3 ]
then

echo ok
else
echo nook
fi
保存後退出執行腳本
[root@linletao-001 shell]# sh if2.sh
nook
這裏面就是條件沒有大於3,不滿足條件,所以就打印了nook。

格式3:if …; then … ;elif …; then …; else …; fi
在滿足條件的基礎上又進行比較。elif是又加了一個邏輯判斷,他後面接done,這個可以寫很多個。
#!/bin/bash
a=3
if [ $a -gt 4 ]
then
echo ">1"
elif [ $a -gt 6 ]
then
echo "<6 && >1"

else
echo nook
fi
保存後退出,並執行。
[root@linletao-001 shell]# sh -x if3.sh

  • a=3
  • ‘[‘ 3 -gt 4 ‘]‘
  • ‘[‘ 3 -gt 6 ‘]‘
  • echo nook
    nook
    可以看出,他執行了兩次邏輯判斷。

邏輯判斷表達式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等
-gt (大於>);
-lt(小於<);
-ge(大於等於>=);
-le(小於等於<=);
-eq(等於=);
-ne(不等於!=)
註意到處都是空格

如果想用符號去寫腳本的話,則要用兩個(())去括起來條件,這樣就可以用符號了。

例如:
#!/bin/bash
a=5
if (($a>3))
then
echo ok
fi

可以使用 && || 結合多個條件
&&表示並且
||表示或者
if [ $a -gt 5 ] && [ $a -lt 10 ]; then
if [ $b -gt 5 ] || [ $b -lt 3 ]; then

文件目錄屬性判斷

[ -f file ]判斷是否是普通文件,且存在。
#!/bin/bash
f="/tmp/linletao"
if [ -f $F ]
then
echo $f exist
else
touch $f
fi
這個腳本的意思是,判斷/tmp/linletao是否存在,如果存在,則打印f的路徑,如果不存在,則創建文件。
[root@linletao-001 ~]# sh -x file1.sh

  • f=/tmp/llt
  • ‘[‘ -f /tmp/llt ‘]‘
  • touch /tmp/llt(沒有文件,然後創建文件)

[root@linletao-001 ~]# sh -x file1.sh

  • f=/tmp/llt
  • ‘[‘ -f /tmp/llt ‘]‘
  • echo /tmp/llt exist
    /tmp/llt exist(文件存在,打印文件路徑)

[ -d file ] 判斷是否是目錄,且存在
[root@linletao-001 ~]# sh -x file2.sh

  • f=/tmp/llt
  • ‘[‘ -d /tmp/llt ‘]‘
  • touch /tmp/llt(沒有文件,然後創建文件)
    這個腳本的意思是判斷文件是否是一個目錄,如果沒有則創建。

[ -e file ] 判斷文件或目錄是否存在
#!/bin/bash
f="/tmp/llt"
if [ -e $f ]
then
echo ok
else
touch $f
fi
這個腳本的意思是判斷/tmp/llt是否存在,如果存在打印ok,如果不存在,則創建文件。
[root@linletao-001 ~]# sh -x file2.sh

  • f=/tmp/llt
  • ‘[‘ -e /tmp/llt ‘]‘
  • echo ok
    ok(文件存在)

[ -r file ] 判斷文件是否可讀
#!/bin/bash
f="/tmp/llt"
if [ -r $f ]
then
echo $f readable
fi
這個腳本的意思是查看問價是否可讀。
[root@linletao-001 ~]# sh -x file2.sh

  • f=/tmp/llt
  • ‘[‘ -r /tmp/llt ‘]‘
  • echo /tmp/llt readable(文件可讀)

[ -w file ] 判斷文件是否可寫
[root@linletao-001 ~]# sh -x file2.sh

  • f=/tmp/llt
  • ‘[‘ -w /tmp/llt ‘]‘
  • echo /tmp/llt writeable
    /tmp/llt writeable(文件可寫)

[ -x file ] 判斷文件是否可執行
#!/bin/bash
f="/tmp/llt"
if [ -x $f ]
then
echo $f exeable
else
echo nook
fi
這個腳本的意思是,是否可執行,如果不可執行,則打印nook

if特殊用法

if [ -z "$a" ] 這個表示當變量a的值為空(變量需要用“”引起來,文件則不用)
例如:
#!/bin/bash
n=wc -l /tmp/lalala(需要註意的是,這裏我們要用反引號引起來)
if [ -z "$n" ]
then
echo error
exit
elif [ $n -gt 100 ]
then
echo ok
fi
這個腳本的意思是,如果$n為空,那麽會打印出error,然後退出。如果不為空,切大於100行,則打印ok
[root@linletao-001 shell]# sh -x if4.sh
++ wc -l /tmp/lalala
wc: /tmp/lalala: 沒有那個文件或目錄

  • n=
  • ‘[‘ -z ‘‘ ‘]‘
  • echo error
    error
  • exit
    運行結果是$n為空,所以打印error,然後退出。

if [ -n "$a" ] 表示當變量a的值不為空
[root@linletao-001 shell]# if [ -n 1.sh ]; then echo ok ; fi
ok
它的意思是當1.sh不為空時,打印ok

在邏輯判斷中,我們也可以使用一個命令的結果作為判斷條件,比如判斷某一個文件中是否含有某些字符串。
例如:
if grep -wq ‘user‘ /etc/passwd; then echo ok; fi
ok
這個腳本的意思是沒如果這個文件中好友user這個字符串,就打印ok。結果是這個文件含有user這個字符串,所以打印ok
if [ ! -e file ]; then 表示文件不存在時會怎麽樣,其中!為取反的意思。

if (($a<1)); then …等同於 if [ $a -lt 1 ]; then…
[ ] 中不能使用<,>,==,!=,>=,<=這樣的符號

case判斷

格式 case 變量名 in
value1)
command
;;
value2)
command
;;
*)
commond
;;
他表示,如果變量在valux1時,執行下面的命令,在value2時執行下面的命令,以此類推。其中;;表示一個判斷結束,進入下一個判斷。

esac在case程序中,可以在條件中使用|,表示或的意思,
比如:
2|3)
command
;;

我們寫一個腳本,case.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

read -p命令,你問用戶做什麽,用戶輸入什麽,最後把用戶的輸入捕獲,作為判斷條件。
例如:
[root@linletao-001 ~]# read -p "please input a number: " n
please input a number: 8
[root@linletao-001 ~]# echo $n
8
其中,n作為你補貨變量的一個名字。用戶輸入什麽,最終這個變量就會賦值什麽。
然後我們執行這個腳本

[root@linletao-001 shell]# sh case.sh
Please input a number: 30
not ok

[root@linletao-001 shell]# sh case.sh
Please input a number: 60
ok

[root@linletao-001 shell]# sh case.sh
Please input a number: 80
ook

[root@linletao-001 shell]# sh case.sh
Please input a number: 100
oook

[root@linletao-001 shell]# sh case.sh
Please input a number: 101
The number range is 0-100.

以上五種情況全部都有結果,表示腳本成功。

執行過程,我們以80為例
[root@linletao-001 shell]# sh -x case.sh

  • read -p ‘Please input a number: ‘ n
    Please input a number: 80
  • ‘[‘ -z 80 ‘]‘
    ++ echo 80
    ++ sed ‘s/[0-9]//g‘
  • n1=
  • ‘[‘ -n ‘‘ ‘]‘
  • ‘[‘ 80 -lt 60 ‘]‘
  • ‘[‘ 80 -ge 60 ‘]‘
  • ‘[‘ 80 -lt 80 ‘]‘
  • ‘[‘ 80 -ge 80 ‘]‘
  • ‘[‘ 80 -lt 90 ‘]‘
  • tag=3
  • case $tag in
  • echo ook
    ook

shell腳本中的邏輯判斷,文件目錄屬性判斷,if特殊用法,case判斷