linux shell 腳本-基礎(chǔ)知識(shí)(二)

條件測試和判斷語句

在shell 中,用戶可以使用測試語句來測試指定的條件表達(dá)式的條件的真或者假。當(dāng)指定的條件為真時(shí),整個(gè)條件測試的返回值為0;反之,如果指定的條件為假,則條件測試語句的返回值為非0值。

條件測試的語法有兩種,分別是test和[命令,下面分別來講解它們的語法:
1)test
test 語法如下:

test expression

參數(shù)expression表示需要測試的條件表達(dá)式,可以由字符串、整數(shù)、文件名,以及各種運(yùn)算符組成。

2)[
test 命令相同,[ 命令的作用也是對后面的條件表達(dá)式進(jìn)行測試,但是為了增加程序的可讀性,shell要求在表達(dá)式后面追加一個(gè)右方括號 ] 來與前面的 [ 命令配對。語法如下:

[ expression ]

[是命令,expression 是條件表達(dá)式。條件表達(dá)式和左右方括號之間都必須有一個(gè)空格。

左方括號 [ 是一個(gè)shell命令,而非條件表達(dá)式的一部分。
而命令與參數(shù)之間必須保留一個(gè)空格。
所以,在上面的語法中,expression與左右括號都需保留一個(gè)空格。

字符串測試

shell中,可以通過5種運(yùn)算符來對字符串進(jìn)行操作。

字符串運(yùn)算符

運(yùn)算符 說明
string 判斷指定的字符串是否為空
string1 = string2 判斷兩個(gè)字符串是否相等
string1 != string2 判斷兩個(gè)字符串是否不相等
-n string 判斷字符串是否非空串
-z string 判斷字符串是夠?yàn)榭沾?/td>

對于字符串測試應(yīng)該基本了解,但應(yīng)注意以下兩點(diǎn):

  • 在給變量賦值的時(shí)候,等號"="左右兩邊一定不要有空格;否則,shell會(huì)把空格前面的字符串當(dāng)作shell命令
  • 在測試運(yùn)算符"="、"!="、及"-z"等符號的左右兩邊,一定含有空格

整數(shù)測試

整數(shù)測試的語法形式為:

[ number1 op number2 ]
運(yùn)算符 說明
number1 -eq number2 比較number1 和number2是否相等。如果相等,測試結(jié)果為0
number1 -ne number2 比較number1 和number2是否不相等。如果不相等,測試結(jié)果為0
number1 -gt number2 比較number1是否大于number2。如果大于,測試結(jié)果為0
number1 -lt number2 比較number1是否小于number2。如果小于,測試結(jié)果為0
number1 -ge number2 比較number1 是否大于等于number2。如果大于等于,測試結(jié)果為0
number1 -le number2 比較number1是否小于等于number2。如果小于等于,測試結(jié)果為0

字符串運(yùn)算符和整數(shù)運(yùn)算符不可以混用。

[root@VM_16_3_centos base]$ x=12.3 
[root@VM_16_3_centos base]$ y=12 
[root@VM_16_3_centos base]$ [ "$x" -gt "$y" ]
-bash: [: 12.3: integer expression expected

文件測試

[ op file ]
操 作 符 說明
-a file 文件是否存在。如果file存在,則結(jié)果為0
-b file 文件是否存在,且為塊文件。如果file是一個(gè)已經(jīng)存在的塊文件,則結(jié)果為0
-c file 文件是否存在,且為字符文件。如果file是一個(gè)已經(jīng)存在的字符文件,則結(jié)果為0
-d file 文件是否存在,且為目錄。如果file是一個(gè)已經(jīng)存在的目錄,則結(jié)果為0
-e file 同-a操作符
-s file 文件的長度是否大于0或者文件為非空文件。如果file是一個(gè)非空文件,則結(jié)果為0
-f file 文件存在,且為常規(guī)文件。如果file是一個(gè)已經(jīng)存在的常規(guī)文件,則結(jié)果為0
-w file 文件是否存在且可寫。如果文件按是一個(gè)可寫文件則結(jié)果為0
?L file 文件是否存在,且為符號鏈接。如果file是一個(gè)已經(jīng)存在的符號鏈接,則結(jié)果為0
?u file 文件是否設(shè)置suid位。如果file已經(jīng)設(shè)置了suid位,則結(jié)果為0
?r file 文件是否存在且可讀。如果文件按是一個(gè)可讀文件則結(jié)果為0
?x file 文件是否存在且可執(zhí)行。如果文件按是一個(gè)可執(zhí)行文件則結(jié)果為0

邏輯操作符

操作符 說明
!expression 邏輯非,條件表達(dá)式expression的值為假,則該操作符的運(yùn)算結(jié)果為真
expression1 -a expression2 邏輯與,條件表達(dá)式expression1和expression2的值都是真時(shí),整個(gè)表達(dá)式的值才為真
expression1 ?o expression2 邏輯或,條件表達(dá)式 expression1或者expression2的值有一個(gè)為真時(shí),整個(gè)表達(dá)式的值就為真

條件判斷語句

1.使用簡單的if語句進(jìn)行判斷

if expression
then
    statement
    statement
fi

例4:通過條件測試判斷某些文件的類型

#!/bin/bash

# 通過條件測試判斷/bin/bash 文件是否存在
if [ -a /bin/bash ]
then
    echo "/bin/bash exist!"
fi

結(jié)果為

[root@VM_16_3_centos if_test]$ sh if.sh 
/bin/bash exist!

例5:使用空命令作為判斷條件

#! /bin/bash

if :; 
then
    echo "always true"; 
fi

空命令":"的退出狀態(tài)永遠(yuǎn)為0,因此會(huì)輸出 always true。

例6:使用&&代替 if 語句進(jìn)行判斷

#! /bi/bash

test "$whoami" != "root" && (echo you are using a non-privileged account; exit 1)

該判斷語句首先對當(dāng)前用戶進(jìn)行判斷,如果當(dāng)前用戶不為root,也即為真則輸出后面的說明語句。

2.使用if else 語句進(jìn)行流程控制

if expression 
then 
    statement1
    statement2
    ..
else 
    statement3
    statement4
    ..
fi

3.使用if elif進(jìn)行多條件判斷

if expression
then 
    statement1
    statement2
    ..
elif expression
then
    statement3
    statement4
    ..
else
    statement5
    ..
fi

4.使用exit語句退出程序

exit status

status參數(shù)表示退出狀態(tài),該參數(shù)是一個(gè)整數(shù)值,其取值范圍為0~255;

按照慣例,退出狀態(tài)0意味著腳本成功運(yùn)行完畢;而非0通常意味著程序執(zhí)行過程中出現(xiàn)某些錯(cuò)誤。
因此,用戶可以用其它的非0值來給父進(jìn)程傳遞不同的消息,根據(jù)子進(jìn)程的成功或者失敗,父進(jìn)程采取不同的措施,如果沒有參數(shù)給語句,那么由exit語句之前的那條語句的執(zhí)行狀態(tài)來決定。

5.多條件判斷語句case

case語句基本語法:

case variable in
value1)
    statement1
    statement2
    ..
    statementn;;
value2)
    statement1
    statement2
    ..
    statementn;;
...
valuen)
    statement1
    statement2
    ..
    statementn;;
#其它情況
*)
    statement1
    statement2
    ..
    statementn;;
#相當(dāng)于if 結(jié)尾fi
esac

6.利用case語句處理用戶輸入

例7:說明case語句的使用方法

#! /bin/bash

echo "Hit a key, then hit return."
#讀取用戶按下的鍵
read keypress
#case語句開始
case "$keypress" in
    #小寫字母
    [[:lower:]])
        echo "Lowercase letter.";;
    [[:upper:]])
        echo "Uppercase letter.";;
    [0-9])
        echo "Digit.";;
    *)
        echo "other letter.";;
esac

7.運(yùn)算符

1.使用expr外部程序
#!/bin/bash

#注意: 要用反引號括起來
result=`expr 2 - 100`
echo "result=${result}"
result=`expr 2-100`
echo "result=${result}"

result=`expr \( 2 - 6 \) \* 12`
echo "result=${result}"

result=`expr (2-6)*12`
echo "result=${result}"

結(jié)果為

[root@VM_16_3_centos if_test]$ sh expr.sh 
result=-98
result=2-100
result=-48
expr.sh: command substitution: line 12: syntax error near unexpected token `2-6'
expr.sh: command substitution: line 12: `expr (2-6)*12'
result=

使用expr命令時(shí)要注意運(yùn)算符左右兩邊的空格,同時(shí)需要將括號進(jìn)行轉(zhuǎn)義表示,括號兩邊也要注意空格

2.使用$((…))

例10:演示使用$((…))符號進(jìn)行算術(shù)運(yùn)算

#!/bin/bash

result=$(( 3+6 ))
echo "result= $result"

result=$(( (1-4) * 5 ))
echo "result= $result"
result= 9
result= -15
3.使用let命令

例11:演示使用let命令執(zhí)行算術(shù)運(yùn)算

#! /bin/bash

n=10
let n=n+1
echo "$n"
let n=n*10
echo "$n"
let n=n**2
echo "$n"
11
110
12100
4.使用位運(yùn)算符

例12:演示使用位運(yùn)算符的方法

#! /bin/bash

result=$[ 2 << 3 ]
echo "$result"
result=$[ 8>> 2 ]
echo "$result"
result=$[ 8 & 4 ]
echo "$result"
result=$[ ~8 ]
echo "$result"
result=$[ 10 ^ 6 ]
echo "$result"

結(jié)果為:

16
2
0
-9
12
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個(gè)...
    _小老虎_閱讀 6,338評論 0 10
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,716評論 0 5
  • 字符串運(yùn)算符 運(yùn)算符 說明 string 判斷指定的字符串是否為空 string1 = string 2...
    Al_不期而遇閱讀 171評論 0 0
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,980評論 0 9
  • 黃昏里 彩霞燦爛了天邊 陽光斜照著 射出云層 似皮筋 拉得長長的 緊緊的 綁在樹上 拉著走 樹站在原地 留下長長的...
    杖劍走四方閱讀 156評論 0 8

友情鏈接更多精彩內(nèi)容