linux系統中shell指令碼最全詳解二&shell條件判斷&語法介紹&函數分析

2020-08-13 16:26:59

目錄

一、shell判斷句

1、if條件判斷語句

 2、test判斷

二、語法介紹

1、shell運算子

2、shell回圈語句

三、shell函數


一、shell判斷句


1、if條件判斷語句

if語法

#!/bin/bash
a=10
b=10
if [ $a -eq $b ];then
echo "兩個數相等"
fi

# 輸出:兩個數相等

if else語法

#!/bin/bash
string="hello"
string1="HELLO"
if test $string = $string1
then
echo "兩個字串一樣"
else
echo "兩個字串不一樣"
fi

#輸出:兩個字串不一樣

 if else-if else語法

以下範例判斷兩個變數是否相等:

if [ "xx" = "xx" ]; then
echo "if"
elif [ "xx" = "xx" ]; then
echo "elseif"
else
echo "else"
fi

#輸出:if

 2、test判斷

Shell中的 test 命令用於檢查某個條件是否成立,它可以進行數值字元檔案三個方面的測試。

數值測試

參數

說明

-eq

等於則爲真

-ne

不等於則爲真

-gt

大於則爲真

-ge

大於等於則爲真

-lt

小於則爲真

-le

小於等於則爲真

範例演示:

#!/bin/bash

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '兩個數相等!'
else
    echo '兩個數不相等!'
fi

字串測試

參數

說明

=

等於則爲真

!=

不相等則爲真

-z 字串

字串的長度爲零則爲真

-n 字串

字串的長度不爲零則爲真

範例演示:

#!/bin/bash

num1="chenzhe"
num2="chenzhe1"
if test $num1 = $num2
then
    echo '兩個字串相等!'
else
    echo '兩個字串不相等!'
fi

檔案測試

參數

說明

-e 檔名

如果檔案存在則爲真

-r 檔名

如果檔案存在且可讀則爲真

-w 檔名

如果檔案存在且可寫則爲真

-x 檔名

如果檔案存在且可執行則爲真

-s 檔名

如果檔案存在且至少有一個字元則爲真

-d 檔名

如果檔案存在且爲目錄則爲真

-f 檔名

如果檔案存在且爲普通檔案則爲真

-c 檔名

如果檔案存在且爲字元型特殊檔案則爲真

-b 檔名

如果檔案存在且爲塊特殊檔案則爲真

範例演示:

#!/bin/bash

cd /bin
if test -e ./bash
then
    echo '檔案已存在!'
else
    echo '檔案不存在!'
fi

另外,Shell還提供了與( -a )、或( -o )、非( ! )三個邏輯操作符用於將測試條件連線起來,其優先順序爲:"!"最高,"-a"次之,"-o"最低。例如:

#!/bin/bash

cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '至少有一個檔案存在!'
else
    echo '兩個檔案都不存在'
fi

 

二、語法介紹


1、shell運算子

Shell 和其他程式語言一樣,支持多種運算子,包括:算數運算子、關係運算符、布爾運算子、字串運算子、檔案測試運算子

 算術運算子

下表列出了常用的算術運算子,假定變數 a 爲 10,變數 b 爲 20:

運算子

說明

舉例

+

加法

`expr $a + $b` 結果爲 30。

-

減法

`expr $a - $b` 結果爲 -10。

*

乘法

`expr $a \* $b` 結果爲  200。

/

除法

`expr $b / $a` 結果爲 2。

%

取餘

`expr $b % $a` 結果爲 0。

=

賦值

a=$b 將把變數 b 的值賦給 a。

==

相等。用於比較兩個數位,相同則返回 true。

[ $a == $b ] 返回 false。

!=

不相等。用於比較兩個數位,不相同則返回 true。

[ $a != $b ] 返回 true。

範例

#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
if [ $a == $b ]
then
   echo "a 等於 b"
fi
if [ $a != $b ]
then
   echo "a 不等於 b"
fi

注意:條件表達式要放在方括號之間,並且要有空格,例如: [$a==$b] 是錯誤的,必須寫成 [ $a == $b ]

乘號(*)前邊必須加反斜槓(\)才能 纔能實現乘法運算;`expr $a + $b`==$(($a+$b))

關係運算符

關係運算符只支援數位,不支援字串,除非字串的值是數位。

下表列出了常用的關係運算符,假定變數 a 爲 10,變數 b 爲 20:

運算子

說明

舉例

-eq

檢測兩個數是否相等,相等返回 true。

[ $a -eq $b ] 返回 false。

-ne

檢測兩個數是否不相等,不相等返回 true。

[ $a -ne $b ] 返回 true。

-gt

檢測左邊的數是否大於右邊的,如果是,則返回 true。

[ $a -gt $b ] 返回 false。

-lt

檢測左邊的數是否小於右邊的,如果是,則返回 true。

[ $a -lt $b ] 返回 true。

-ge

檢測左邊的數是否大於等於右邊的,如果是,則返回 true。

[ $a -ge $b ] 返回 false。

-le

檢測左邊的數是否小於等於右邊的,如果是,則返回 true。

[ $a -le $b ] 返回 true。

       範例

#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
   echo " a 等於 b"
else
   echo " a 不等於 b"
fi
if [ $a -gt $b ]
then
   echo "a 大於 b"
else
   echo "a 不大於 b"
fi
if [ $a -lt $b ]
then
   echo "a 小於 b"
else
   echo "a 不小於 b"
fi

邏輯運算子

以下介紹 Shell 的邏輯運算子,假定變數 a 爲 10,變數 b 爲 20:

運算子

說明

舉例

&&

邏輯的 AND

[[ $a -lt 100 && $b -gt 100 ]] 返回 false

||

邏輯的 OR

[[ $a -lt 100 || $b -gt 100 ]] 返回 true

範例

邏輯運算子範例如下:

#!/bin/bash
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi


if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

 

字串運算子

下表列出了常用的字串運算子,假定變數 a 爲 "abc",變數 b 爲 "efg":

運算子

說明

舉例

=

檢測兩個字串是否相等,相等返回 true。

[ $a = $b ] 返回 false。

!=

檢測兩個字串是否相等,不相等返回 true。

[ $a != $b ] 返回 true。

-z

檢測字串長度是否爲0,爲0返回 true。

[ -z $a ] 返回 false。

-n

檢測字串長度是否爲0,不爲0返回 true。

[ -n "$a" ] 返回 true。

$

檢測字串是否爲空,不爲空返回 true。

[ $a ] 返回 true。

範例

字串運算子範例如下:

#!/bin/bash
a="abc"
b="efg"
if [ $a = $b ]
then
   echo "a 等於 b"
else
   echo " a 不等於 b"
fi
if [ -z $a ]
then
   echo "字串長度爲 0"
else
   echo " 字串長度不爲 0"
fi


if [ $a ]
then
   echo "$a : 字串不爲空"
else
   echo "$a : 字串爲空"
fi

檔案測試運算子

檔案測試運算子用於檢測 Unix 檔案的各種屬性。

屬性檢測描述如下:

操作符

說明

舉例

-b file

檢測檔案是否是塊裝置檔案,如果是,則返回 true。

[ -b $file ] 返回 false。

-c file

檢測檔案是否是字元裝置檔案,如果是,則返回 true。

[ -c $file ] 返回 false。

-d file

檢測檔案是否是目錄,如果是,則返回 true。

[ -d $file ] 返回 false。

-f file

檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案),如果是,則返回 true。

[ -f $file ] 返回 true。

-g file

檢測檔案是否設定了 SGID 位,如果是,則返回 true。

[ -g $file ] 返回 false。

-k file

檢測檔案是否設定了粘着位(Sticky Bit),如果是,則返回 true。

[ -k $file ] 返回 false。

-p file

檢測檔案是否是有名管道,如果是,則返回 true。

[ -p $file ] 返回 false。

-u file

檢測檔案是否設定了 SUID 位,如果是,則返回 true。

[ -u $file ] 返回 false。

-r file

檢測檔案是否可讀,如果是,則返回 true。

[ -r $file ] 返回 true。

-w file

檢測檔案是否可寫,如果是,則返回 true。

[ -w $file ] 返回 true。

-x file

檢測檔案是否可執行,如果是,則返回 true。

[ -x $file ] 返回 true。

-s file

檢測檔案是否爲空(檔案大小是否大於0),不爲空返回 true。

[ -s $file ] 返回 true。

-e file

檢測檔案(包括目錄)是否存在,如果是,則返回 true。

[ -e $file ] 返回 true。

範例

變數 file 表示檔案/root/install.log,它的大小爲 100 位元組,具有 rwx 許可權。下面 下麪的程式碼,將檢測該檔案的各種屬性:

#!/bin/bash
file="/root/install.log"
if [ -r $file ]
then
   echo "檔案可讀"
else
   echo "檔案不可讀"
fi


if [ -w $file ]
then
   echo "檔案可寫"
else
   echo "檔案不可寫"
fi


if [ -x $file ]
then
   echo "檔案可執行"
else
   echo "檔案不可執行"
fi


if [ -f $file ]
then
   echo "檔案爲普通檔案"
else
   echo "檔案爲特殊檔案"
fi


if [ -d $file ]
then
   echo "檔案是個目錄"
else
   echo "檔案不是個目錄"
fi


if [ -e $file ]
then
   echo "檔案存在"
else
   echo "檔案不存在"
fi

2、shell回圈語句

for語句,案例:

#!/bin/bash

for num in 1 2 3 4 5
do
    echo "The value is: $num"
done

順序輸出字串中的字元:

for str in 'This is a string'
do
    echo $str
done

 while 語句

while回圈用於不斷執行一系列命令,也用於從輸入檔案中讀取數據;命令通常爲測試條件。

以下是一個基本的while回圈,測試條件是:如果int小於等於5,那麼條件返回真。int從0開始,每次回圈處理時,int加1。執行上述指令碼,返回數位1到5,然後終止。

#!/bin/bash

int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

另外:while回圈可用於讀取鍵盤資訊。下面 下麪的例子中,輸入資訊被設定爲變數FILM,按<Ctrl-D>結束回圈。

#!/bin/bash

echo -n '輸入你最喜歡的老師名: '
while read person

do
    echo "是的!$person 是一個好人"
done

無限回圈

無限回圈語法格式:

while :
do
    command
done

或者

while true
do
    command
done

 until 回圈

until 回圈執行一系列命令直至條件爲 true 時停止。

until 回圈與 while 回圈在處理方式上剛好相反。

以下範例我們使用 until 命令來輸出 0 ~ 9 的數位:

#!/bin/bash

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

case多選擇語句

Shell case語句爲多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令

下面 下麪的指令碼提示輸入1到4,與每一種模式進行匹配:

echo '輸入 1 到 4 之間的數位:'
echo '你輸入的數位爲:'
read num
case $num in
    1)  echo '你選擇了 1'
    ;;
    2)  echo '你選擇了 2'
    ;;
    3)  echo '你選擇了 3'
    ;;
    4)  echo '你選擇了 4'
    ;;
    *)  echo '你沒有輸入 1 到 4 之間的數位'
    ;;
esac

 break命令

break命令允許跳出所有回圈(終止執行後面的所有回圈)。

下面 下麪的例子中,指令碼進入死回圈直至使用者輸入數位大於5。要跳出這個回圈,返回到shell提示符下,需要使用break命令。

#!/bin/bash
while :
do
    echo -n "輸入 1 到 5 之間的數位:"
    read num
    case $num in
        1|2|3|4|5) echo "你輸入的數位爲 $aNum!"
        ;;
        *) echo "你輸入的數位不是 1 到 5 之間的! 遊戲結束"
            break
        ;;
    esac
done

 

三、shell函數


linux shell 可以使用者定義函數,然後在shell指令碼中可以隨便呼叫。

舉例:

#!/bin/bash
sayHi(){
    echo "hello 1906"
}
sayHi

下面 下麪定義一個帶有return語句的函數:

#!/bin/bash

funWithReturn(){
    echo "這個函數會對輸入的兩個數位進行相加運算..."
    echo "輸入第一個數位: "
    read num1
    echo "輸入第二個數位: "
    read num2
    echo "兩個數位分別爲 $num1 和 $num2 "
    return $(($num1+$num2))
}
funWithReturn
echo "輸入的兩個數位之和爲 $? "

函數參數

在Shell中,呼叫函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數...

帶參數的函數範例:

#!/bin/bash
funWithParam(){
    echo "第一個參數爲 $1 "
    echo "第二個參數爲 $2 "
    echo "第十個參數爲 $10 "
    echo "第十個參數爲 ${10} "
    echo "第十一個參數爲 ${11} "
    echo "參數總數有 $# 個"
    echo "作爲一個字串輸出所有參數 $* "
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

注意:$10 不能獲取第十個參數,獲取第十個參數需要${10}。當n>=10時,需要使用${n}來獲取參數。

 

總結不易,期待您的關注,我們一起進步,沖沖衝!!!