1. 程式人生 > >shell程式設計——if語句 if -z -n -f -eq -ne -lt

shell程式設計——if語句 if -z -n -f -eq -ne -lt

shell程式設計中條件表示式的使用

if  條件
then
 Command
else
 Command
fi                              別忘了這個結尾
If語句忘了結尾fi
test.sh: line 14: syntax error: unexpected end of fi



if 的三種條件表示式

if
command
then

if
 函式
then
 命令執行成功,等於返回0 (比如grep ,找到匹配)
執行失敗,返回非0 (grep,沒找到匹配)
if [ expression_r_r_r  ]
then 
 表示式結果為真,則返回0,if把0值引向then
if test expression_r_r_r
then
 表示式結果為假,則返回非0,if把非0值引向then



[ ] &&  ——快捷if

[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
   && 可以理解為then
    如果左邊的表示式為真則執行右邊的語句



shell的if與c語言if的功能上的區別

 shell if     c語言if
0為真,走then  正好相反,非0走then
 不支援整數變數直接if
必須:if [ i –ne 0 ]

但支援字串變數直接if
if [ str ] 如果字串非0
 支援變數直接if
if (i )



=================================以command作為if 條件===================================

以多條command或者函式作為if 條件

echo –n “input:”
read user

if
多條指令,這些命令之間相當於“and”(與)
grep $user /etc/passwd >/tmp/null      
who -u | grep $user
then             上邊的指令執行成功,返回值$?為0,0為真,執行then
 echo "$user has logged"
else     指令執行失敗,$?為1,執行else                            
 echo "$user has not logged"
fi   
# sh test.sh
input : macg
macg     pts/0        May 15 15:55   .          2075 (192.168.1.100)
macg has logged
   
# sh test.sh
input : ddd
ddd has not logged  



以函式作為if條件  (函式就相當於command,函式的優點是其return值可以自定義)

if
以函式作為if條件,
getyn
then   函式reture值0為真,走then
echo " your answer is yes"
else  函式return值非0為假,走else
echo "your anser is no"
fi  



if command  等價於 command+if $?

$ vi testsh.sh
#!/bin/sh

if
cat 111-tmp.txt | grep ting1
then
echo found
else
echo "no found"
fi
 $ vi testsh.sh
#!/bin/sh

cat 111-tmp.txt | grep ting1

if [ $? -eq 0 ]
then
echo $?
echo found
else
echo $?
echo "no found"
fi
$ sh testsh.sh
no found  
$ sh testsh.sh
1
no found
$ vi 111-tmp.txt
that is 222file
thisting1 is 111file

$ sh testsh.sh
thisting1 is 111file
found
$ vi 111-tmp.txt
that is 222file
thisting1 is 111file

$ sh testsh.sh
thisting1 is 111file
0
found



========================================以條件表示式作為 if條件=============================

傳統if 從句子——以條件表示式作為 if條件
if [ 條件表示式 ]
then
command
command
command
else
command
command
fi

   條件表示式

  • 檔案表示式

if [ -f  file ]    如果檔案存在
if [ -d ...   ]    如果目錄存在
if [ -s file  ]    如果檔案存在且非空 
if [ -r file 如果檔案存在且可讀
if [ -w file ]  如果檔案存在且可寫
if [ -x file ]  如果檔案存在且可執行  

  • 整數變量表達式

if [ int1 -eq int2 ]    如果int1等於int2   
if [ int1 -ne int2 ]    如果不等於   
if [ int1 -ge int2 ] 如果>=
if [ int1 -gt int2 ] 如果>
if [ int1 -le int2 ] 如果<=
if [ int1 -lt int2 ] 如果<

  •    字串變量表達式

If [ $a = $b ] 如果string1等於string2
字串允許使用賦值號做等號
if [ $string1 != $string2 ] 如果string1不等於string2 
if  [ -n $string  ]             如果string 非空(非0),返回0(true)
if [ -z $string 如果string 為空
if  [ $sting ]                  如果string 非空,返回0 (和-n類似)  


條件表示式引用變數要帶$

if [ a = b ] ;then    
echo equal
else
echo no equal
fi
[[email protected] ~]$ sh test.sh
input a:
5
input b:
5
no equal  (等於表示式沒比較$a和$b,而是比較和a和b,自然a!=b)

改正:

if [ $a = $b ] ;then       
echo equal
else
echo no equal
fi
[[email protected] ~]$ sh test.sh
input a:
5
input b:
5
equal



-eq  -ne  -lt  -nt只能用於整數,不適用於字串,字串等於用賦值號=

[[email protected] ~]$ vi test.sh
echo -n "input your choice:"
read var
if  [ $var -eq "yes" ]
then
echo $var
fi
[[email protected] ~]$ sh -x test.sh
input your choice:
y
test.sh: line 3: test: y: integer expression_r_r_r expected
                       期望整數形式,即-eq不支援字串




  =放在別的地方是賦值,放在if [ ] 裡就是字串等於,shell裡面沒有==的,那是c語言的等於


無空格的字串,可以加" ",也可以不加

[[email protected] ~]$ vi test.sh
echo "input a:"
read a
echo "input is $a"
if [ $a = 123 ] ; then
echo equal123
fi
[[email protected] ~]$ sh test.sh
input a:
123
input is 123
equal123 



   = 作為等於時,其兩邊都必須加空格,否則失效
等號也是操作符,必須和其他變數,關鍵字,用空格格開 (等號做賦值號時正好相反,兩邊不能有空格)

[[email protected] ~]$ vi test.sh

echo "input your choice:"
read var
if [ $var="yes" ]
then
echo $var
echo "input is correct"
else
echo $var
echo "input error"
fi
[[email protected] ~]$ vi test.sh

echo "input your choice:"
read var
if [ $var = "yes" ]   在等號兩邊加空格
then
echo $var
echo "input is correct"
else
echo $var
echo "input error"
fi
[[email protected] ~]$ sh test.sh
input your choice:
y
y
input is correct
[[email protected] ~]$ sh test.sh
input your choice:
n    
n
input is correct 
輸錯了也走then,都走then,為什麼?
因為if把$var="yes"連讀成一個變數,而此變數為空,返回1,則走else
 [[email protected] ~]$ sh test.sh
input your choice:
y
y
input error
[[email protected] ~]$ sh test.sh
input your choice:
no                       
no
input error
一切正常



If  [  $ANS  ]     等價於  if [ -n $ANS ]
如果字串變數非空(then) , 空(else)

echo "input your choice:"
read ANS

if [ $ANS ]
then
echo no empty
else
echo empth
fi 
[[email protected] ~]$ sh test.sh
input your choice:                       回車
                                                
empth                                    說明“回車”就是空串
[[email protected] ~]$ sh test.sh
input your choice:
34
no empty 



整數條件表示式,大於,小於,shell裡沒有> 和< ,會被當作尖括號,只有-ge,-gt,-le,lt

[[email protected] ~]$ vi test.sh

echo "input a:"
read a
if  [ $a -ge 100 ] ; then
echo 3bit
else
echo 2bit
fi
[[email protected] ~]$ sh test.sh
input a:
123
3bit
[[email protected] ~]$ sh test.sh
input a:
20
2bit



整數操作符號-ge,-gt,-le,-lt, 別忘了加-

if  test $a  ge 100 ; then

[[email protected] ~]$ sh test.sh
test.sh: line 4: test: ge: binary operator expected
if  test $a -ge 100 ; then

[[email protected] ~]$ sh test.sh
input a:
123
3bit



============================邏輯表示式=========================================
    邏輯非 !                   條件表示式的相反
if [ ! 表示式 ]
if [ ! -d $num ] 如果不存在目錄$num


    邏輯與 –a條件表示式的並列
if [ 表示式1 –a 表示式2 ]


邏輯或 -o          條件表示式的或
if [ 表示式1 –o 表示式2 ]


   邏輯表示式

  •     表示式與前面的=  != -d –f –x -ne -eq -lt等合用
  •     邏輯符號就正常的接其他表示式,沒有任何括號( ),就是並列

if [ -z "$JHHOME" -a -d $HOME/$num ]

  •     注意邏輯與-a與邏輯或-o很容易和其他字串或檔案的運算子號搞混了



最常見的賦值形式,賦值前對=兩邊的變數都進行評測
左邊測變數是否為空,右邊測目錄(值)是否存在(值是否有效)

[[email protected] ~]$ vi test.sh
:
echo "input the num:"
read num
echo "input is $num"

if [ -z "$JHHOME" -a -d $HOME/$num ]   如果變數$JHHOME為空,且$HOME/$num目錄存在
then
JHHOME=$HOME/$num                      則賦值
fi

echo "JHHOME is $JHHOME"  
-----------------------
[[email protected] ~]$ sh test.sh
input the num:
ppp
input is ppp
JHHOME is

目錄-d $HOME/$num   不存在,所以$JHHOME沒被then賦值
[[email protected] ~]$ mkdir ppp
[[email protected] ~]$ sh test.sh
input the num:
ppp
input is ppp
JHHOME is /home/macg/ppp



   一個-o的例子,其中卻揭示了”=”必須兩邊留空格的問題

echo "input your choice:"
read ANS

if [ $ANS="Yes" -o $ANS="yes" -o $ANS="y" -o $ANS="Y" ]
then
ANS="y"
else
ANS="n"
fi

echo $ANS
[[email protected] ~]$ sh test.sh
input your choice:
n
y
[[email protected] ~]$ sh test.sh
input your choice:
no
y
為什麼輸入不是yes,結果仍是y(走then)
因為=被連讀了,成了變數$ANS="Yes",而變數又為空,所以走else了
[[email protected] ~]$ vi test.sh

echo "input your choice:"
read ANS    echo "input your choice:"
read ANS

if [ $ANS = "Yes" -o $ANS = "yes" -o $ANS = "y" -o $ANS = "Y" ]
then
ANS="y"
else
ANS="n"
fi

echo $ANS
[[email protected] ~]$ sh test.sh
input your choice:
no
n
[[email protected] ~]$ sh test.sh
input your choice:
yes
y
[[email protected] ~]$ sh test.sh
input your choice:
y
y



===================以 test 條件表示式 作為if條件===================================

if test $num -eq 0      等價於   if [ $num –eq 0 ]

  test  表示式,沒有 [  ]
if test $num -eq 0 
then
echo "try again"
else
echo "good"
fi

    man test

[[email protected] ~]$ man test
[(1)                             User Commands                            [(1)

SYNOPSIS
       test EXPRESSION
       [ EXPRESSION ]


       [-n] STRING
              the length of STRING is nonzero          -n和直接$str都是非0條件

       -z STRING
              the length of STRING is zero

       STRING1 = STRING2
              the strings are equal

       STRING1 != STRING2
              the strings are not equal

       INTEGER1 -eq INTEGER2
              INTEGER1 is equal to INTEGER2

       INTEGER1 -ge INTEGER2
              INTEGER1 is greater than or equal to INTEGER2

       INTEGER1 -gt INTEGER2
              INTEGER1 is greater than INTEGER2

       INTEGER1 -le INTEGER2
              INTEGER1 is less than or equal to INTEGER2

       INTEGER1 -lt INTEGER2
              INTEGER1 is less than INTEGER2

       INTEGER1 -ne INTEGER2
              INTEGER1 is not equal to INTEGER2

       FILE1 -nt FILE2
              FILE1 is newer (modification date) than FILE2

       FILE1 -ot FILE2
              FILE1 is older than FILE2

       -b FILE
              FILE exists and is block special

       -c FILE
              FILE exists and is character special

       -d FILE
              FILE exists and is a directory

       -e FILE
              FILE exists                                 檔案存在

       -f FILE
              FILE exists and is a regular file     檔案存在且是普通檔案

       -h FILE
              FILE exists and is a symbolic link (same as -L)

       -L FILE
              FILE exists and is a symbolic link (same as -h)

       -G FILE
              FILE exists and is owned by the effective group ID

       -O FILE
              FILE exists and is owned by the effective user ID

       -p FILE
              FILE exists and is a named pipe


       -s FILE
              FILE exists and has a size greater than zero

       -S FILE
              FILE exists and is a socket

       -w FILE
              FILE exists and is writable

       -x FILE
FILE exists and is executable
 



======================if簡化語句=================================

最常用的簡化if語句

   && 如果是“前面”,則“後面”
[ -f /var/run/dhcpd.pid ] && rm /var/run/dhcpd.pid    檢查 檔案是否存在,如果存在就刪掉
   ||   如果不是“前面”,則後面
[ -f /usr/sbin/dhcpd ] || exit 0    檢驗檔案是否存在,如果存在就退出


用簡化 if 和$1,$2,$3來檢測引數,不合理就呼叫help
[ -z "$1" ] && help                 如果第一個引數不存在(-z  字串長度為0 )
[ "$1" = "-h" ] && help 如果第一個引數是-h,就顯示help


例子
#!/bin/sh

[ -f "/etc/sysconfig/network-scripts/ifcfg-eth0" ] && rm -f /etc/sysconfig/network-scripts/ifcfg-eth0
cp ifcfg-eth0.bridge /etc/sysconfig/network-scripts/ifcfg-eth0

[ -f "/etc/sysconfig/network-scripts/ifcfg-eth1" ] && rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
cp ifcfg-eth1.bridge /etc/sysconfig/network-scripts/ifcfg-eth1

[ -f "/etc/sysconfig/network-scripts/ifcfg-eth0:1" ] && rm -f /etc/sysconfig/network-scripts/ifcfg-eth0:1

s​h​e​l​l​中​條​件​判​斷​i​f​中​的​-​z​到​-​d​的​意​思

[ -a FILE ] 如果 FILE 存在則為真。 
[ -b FILE ] 如果 FILE 存在且是一個塊特殊檔案則為真。 

[ -c FILE ] 如果 FILE 存在且是一個字特殊檔案則為真。 

[ -d FILE ] 如果 FILE 存在且是一個目錄則為真。 

[ -e FILE ] 如果 FILE 存在則為真。 
[ -f FILE ] 如果 FILE 存在且是一個普通檔案則為真。

[ -g FILE ] 如果 FILE 存在且已經設定了SGID則為真。
[ -h FILE ] 如果 FILE 存在且是一個符號連線則為真。

[ -k FILE ] 如果 FILE 存在且已經設定了粘制位則為真。 [

-p FILE ] 如果 FILE 存在且是一個名字管道(F如果O)則為真。

[ -r FILE ] 如果 FILE 存在且是可讀的則為真。 

[ -s FILE ] 如果 FILE 存在且大小不為0則為真。 
[ -t FD ] 如果檔案描述符 FD 開啟且指向一個終端則為真。

[ -u FILE ] 如果 FILE 存在且設定了SUID (set user ID)則為真。 

[ -w FILE ] 如果 FILE 如果 FILE 存在且是可寫的則為真。 

[ -x FILE ] 如果 FILE 存在且是可執行的則為真。 

[ -O FILE ] 如果 FILE 存在且屬有效使用者ID則為真。

[ -G FILE ] 如果 FILE 存在且屬有效使用者組則為真。 [ -L FILE ] 如果 FILE 存在且是一個符號連線則為真。 
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read則為真。 
[ -S FILE ] 如果 FILE 存在且是一個套接字則為真。 
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2,or 如果 FILE1 exists and FILE2 does not則為真。 
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在則為真。 
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的裝置和節點號則為真。 

[ -o OPTIONNAME ] 如果 shell選項 “OPTIONNAME” 開啟則為真。 

[ -z STRING ] “STRING” 的長度為零則為真。 
[ -n STRING ] or [ STRING ] “STRING” 的長度為非零 non-zero則為真。 
[ STRING1 == STRING2 ] 如果2個字串相同。 “=” may be used instead of “==” for strict POSIX compliance則為真。 
[ STRING1 != STRING2 ] 如果字串不相等則為真。 
[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale則為真。 
[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale則為真。 
[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.


轉載自http://www.dutycode.com/post-46.html

相關推薦

shell程式設計——if語句 if -z -n -f -eq -ne -lt

shell程式設計中條件表示式的使用 if  條件 then  Command else  Commandfi                              別忘了這個結尾 If語句忘了結尾fi test.sh: line 14: syntax erro

IC數字前端設計開發17 (Shell中判斷語句if中-z至-d的意思)

[ -a FILE ] 如果 FILE 存在則為真。 [ -b FILE ] 如果 FILE 存在且是一個塊特殊檔案則為真。 [ -c FILE ] 如果 FILE 存在且是一個字特殊檔案則為真。 [ -d FILE ] 如果 FILE 存在且是一個目錄則為真。

學習筆記 shell流程控制語句 if 和 for

if條件測試語句 使用單分支的if條件語句來判斷/media/cdrom檔案是否存在,若存在就結束條件判斷和整個Shell指令碼,反之則去建立這個目錄: [[email protected] ~]# vim 1.sh #!/bin/bash DIR="

shell程式設計-迴圈語句

一、for語句 for迴圈語句有兩種格式,分別如下: (一)for in語句 for var in list do commands done list代表要迴圈的值,在每次迴圈的時候,會把當前的值賦值給var(變數名而已,隨意定), 這樣在迴圈體中就可以直接通過$var獲

shell程式設計——case語句

case語句格式 # vi test.sh:echo "input : "read numecho "the input data is $num"case $num in1) echo "January";;     雙分號結束2) echo "Feburary";;5)

JSTL &lt;c:if test=“eq ne lt..”>&lt;/if> 用法

邏輯 算術運算 運算 empty not 驗證 != and 關系 類別 運算符 算術運算符 + 、 - 、 * 、 / (或 div )和 % (或 mod ) 關系運算符 == (或 eq )、 != (或 ne )、 < (或 lt )、 > (或 g

Shell程式設計-06-Shell中的if語句

    在任何一門語言中,判斷語句總是少不了,今天來學習一下Shell中的if語句。 基本語法 單分支情況 第一種語法 if <條件表示式> then 語句 fi 第二種語法 if <條件表示式>;then 語句 fi 其中條件表示式部分可以是tes

Linux Shell程式設計之 for迴圈語句 if條件語句

    最近涉及Linux Shell程式設計,還不太熟悉,對於賦值語句,數值計算,迴圈語句,變數使用都不太熟悉。我不打算一個一個的說明知識點,我打算用最多3個例子說明所有的這些知識點。 Example 1 : <span style="font-size:14px;

Shell程式設計IF條件語句各種案例演練

3. if條件語句學習 案例一,測試數字的大小 #!/bin/sh NUM=100 if(($NUM > 4)) ; thenecho "this num is $NUM greater 4 !"fi 必須以fi結尾 9.檔名為 if.sh #!/bin/sh #

[shell]shellif語句的使用

don 條件 如何 ood 字符串 pre 評分 string 另一個 轉自:http://lovelace.blog.51cto.com/1028430/1211353 bash中如何實現條件判斷?條件測試類型: 整數測試 字符測試 文件測試 一、條

shell 中的if語句

bsp != -o 語句 col spa shell clas if語句 if [ t != "." -a t != ".." ] 之前一直不知道 -a 是什麽意思,後來才知道 -a = and ; -o = orshell 中的if語句

shell腳本的if語句,判斷某程序是否存在,不存在啟動該程序!

if語句 .... png div image 一個 ... 語法 新手 想必大家都知道 “如果......那麽......“ 這種語法的應用吧! 當然呢,linux下對於這種用法也是有所考慮的,很多時候我們都需要寫一個shell腳本,難免會避免if語句。 例如:判斷Apa

使用if語句編寫Shell腳本

shell腳本 if語句 楊書凡 shell $? 在簡單的shell腳本程序中,各條語句將按先後順序依次執行,從而實現批處理的自動化過程。然而,單一的順序結構使得腳本不夠智能,難以處理更加靈活的系統任務。通過正確的使用if語句,使得shell腳本具有一定的判斷能力,以根據不同的條

shell腳本之if語句

if語句 技術分享 ces 分享圖片 color term text ffffff shel 1.單分支if語句:格式:示例:2.雙分支if語句:格式:示例:3.多分支if語句:格式:示例:shell腳本之if語句

Shell腳本應用(if語句的結構)

返回值 測試 執行 數值 表達 邏輯 下一個 否則 語句 1、測試:檢測表達式是否成立,成立則返回值為0,否則為非0方法:1)test 表達式2)【 表達式 】2、文件測試:-d:是否為目錄-f:是否為文件-e:是否存在-r:是否有讀取權限-w:是否有寫入權限-x:是否有

Shell腳本(2)-if語句

if語句if語句1、什麽是條件測試操作?要使Shell腳本具有一定的“智能化”,面臨的問題就是區分不同情況下以確定執行何種操作。Shell環境中根據命令執行後的返回狀態值($?)來判斷是否執行成功,當返回值為0時,表示執行成功,否則表示失敗或異常。通過條件測試操作的工具-test命令,可以對特定條件進行測試。

shell】Linux shell if 語句詳解

linux shell 運維 自動化運維 if語句 1.1 if語句解釋 if 是判斷語句,if語句的作用跟 [ ] 差不多,一般判斷比較多或者執行的語句比較多的話,那麽就會使用if 1.2 if 格式 第一種格式 if [ 判斷條件 ];then 內容 else 內容

shell if 語句

執行順序 post 滿足 分支 編程 循環 class shell if shel 一、過程式 編程語言的代碼執行順序:   a.順序執行:逐條執行;   b.選擇執行:     代碼有一個分支:條件滿足是才會執行;     倆個或以上的分支:只會執行其中一個滿足條件的分支

shell編程之if語法、case語法、while語句、until語句、for語句、select語句

指令 AD lse while 循環 語句 while else 表達 select 主要介紹shell基本語句的語法 if語句語法1 單分支結構 (如果,那麽)if <條件測試> ;then 指令;fi 或者如下:if <條件測試>? then?

shell腳本的if判斷語句

mkdir 大小 是否 elif for tmp tar.gz 等於 命令 if語句 1、按照文件類型進行判斷-d 文件)判斷該文件是否存在,並且是否為字符設備文件(是字符設備為真)-e 文件)判斷該文件是否存在(存在為真)[-e /root]echo $?輸出為0