bash shell程式設計學習筆記

2020-08-12 16:36:04

#! /bin/bash

# shell程式設計基礎

 

# Shell指令碼的基本構成

       通常在第1行以「#!」開頭指定Shell指令碼的執行環境,即宣告該指令碼使用哪個Shell程式執行。如果沒有指定,則以當前正在執行的Shell來解釋執行。

       以「#」開頭的行是註釋行

       # 字串左右的反引號(`)用於命令轉換(轉換)

 

# 包含外部指令碼

       包含外部指令碼檔案的用法如下:

           . 指令碼檔名,

           ./指令碼檔名

        或

            source 指令碼檔名

            bash 指令碼檔名

        兩種方式的作用一樣,爲簡單起見,一般使用點號,但要注意點號和指令碼檔名之間一定要有一個空格。

 

# 偵錯Shell指令碼

       在bash中Shell指令碼的偵錯主要是利用bash命令解釋程式的選項來實現。其格式爲:

       bash [選項] 指令碼名

       -v 選項允許使用者檢視Shell程式的讀入和執行,會列印出命令列的原始內容。

       -x 選項允許使用者檢視Shell程式的執行,會列印出經過替換後的命令列的內容。

 

# 使用者自定義變數

       變數無需事先宣告,給變數賦值也就是定義一個變數的過程:

       變數名=變數值

       等號兩邊不能留空格

              參照時需要$符號,如果緊跟在變數名稱後面的字元是字母、數位或下劃線,變數名稱必須要用{}括起來

       刪除變數

              使用 unset 命令可以刪除變數。

       新增環境變數

              使用export命令將變數新增到環境中,作爲臨時的環境變數(一種全域性變數)。

 

# 內部變數

         $0 當前指令碼的檔名

         $n 傳遞給指令碼或函數的參數。n是一個數字,表示第幾個參數。例如,第一個參數是$1,以此類推

         $# 傳遞給指令碼或函數的參數個數

         $* 傳遞給指令碼或函數的所有參數

         $@ 傳遞給指令碼或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同

         $? 上個命令的退出狀態,或函數的返回值

         $$ 當前Shell進程ID。對於 Shell 指令碼,就是這些指令碼所在的進程ID

 

# 陣列

       bash支援一維陣列,不支援多維陣列。

       在Shell中用括號來表示陣列,陣列元素用空格符號分割開:

               陣列名=(值1 ... 值n)

       也可以單獨定義陣列的各個元素。可以不使用連續的下標,而且下標的範圍沒有限制。

       讀取陣列元素值的語法格式爲:

              ${陣列名[下標]}

       採用以下用法獲取陣列元素的個數:

              ${#陣列名[@]}

        以下方法用於取得陣列單個元素的長度:

                ${#陣列名[n]}

 

# 算術表達式

       bash自身並不支援簡單的數學運算,但是可以通過awk 和expr等命令來實現數學運算。

       expr最爲常用,使用它能夠完成表達式的求值操作。

       例如:

               expr 5 + 3

                     注意運算元(用於計算的數)與運算子之間一定要有空格。

 

        更爲簡單的方式是使用$[]表達式進行數學計算,

        例如:

               val=$[5+3]

                      這種形式不要求運算子與運算元之間有空格

 

# 算術運算子

       +:加法

       -:減法

       *:乘法

       /:除法

     %:取餘

      =:賦值

 

 

# 邏輯表達式

通常使用test命令來判斷表達式的真假。

語法格式如下:

        test 邏輯表達式

該命令有一個更常用的別名,即左方括號「[」。語法格式如下:

        [ 邏輯表達式 ]

        中括號兩邊都要有空格

# 整數關係運算符

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

       -ne:不等於。檢測兩個數是否相等,不相等返回 true。

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

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

       -ge:大於等於。

       -le:小於等於。

# 字串檢測運算子

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

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

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

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

       str:檢測字串是否爲空,不爲空返回 true。這裏不用使用運算子,直接測試字串,

               如 [ $a ] 返回 true。

# 檔案測試運算子

       -b:檢測檔案是不是塊裝置檔案,如果是,則返回 true。

       -c:檢測檔案是不是字元裝置檔案,如果是,則返回 true。

       -d:檢測檔案是不是目錄,如果是,則返回 true。

       -f:檢測檔案是不是普通檔案(既非目錄,又非裝置檔案),如果是,則返回 true。

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

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

       -p:檢測檔案是不是具名管道,如果是,則返回 true。

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

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

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

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

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

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

       -a:與運算。兩個表達式都爲 true才返回 true。

       -o:或運算。有一個表達式爲true就返回 true。

         !:非運算。表達式值爲 true 則返回 false,否則返回 true。

 

# 流程控制語句

# if語句

if [ 條件表達式 ]
then
    語句序列1
else
    語句序列2
fi	

 

# case語句

case 值 in
模式1)
    語句序列1
	;;
模式2)
    語句序列2
	;;
	……
模式n) 
    語句序列n
	;;
   *) 
    其他語句序列
esac


#例程
#!/bin/bash                                                                     
function printit()
{
    echo -n "your choice is $1"
}
function help()
{
    cat << HELP                                                             
    echo "this is help manual"                                              
HELP                                                                            
}
echo "this proogram will print your selection !"
case $1 in
    -h) help;;
    "one") printit;echo $1 |tr 'a-z' 'A-Z';;
    "two") printit;echo $1 |tr 'a-z' 'A-Z';;
    "three") printit;echo $1 |tr 'a-z' 'A-Z';;
    *) echo "usage $0 {one|two|three}";;
esac  

 

# 回圈語句while

while 測試條件

do

       語句序列

done

 

#例程:

#! /bin/bash                                                                    
number=0
while [ $number -lt 10 ]
do
    echo $number
    number=`expr $number + 1`
done

 

# 回圈語句until

until 測試條件

do

        語句序列

done

 

例程: 

#! /bin/bash                                                                    
var=10
until [ $var -lt 1 ]
do
    echo $var
    var=$(($var-1))
done	

 

# 回圈語句for

for 變數 [in 列表]

do

     語句序列

done

 

例程:

#! /bin/bash                                                                    
var=0
for var in 1 2 3 4 5  ###
do
    echo "$var"
done	###

 

# 其他回圈語句

       break 語句用來終止一個重複執行的回圈。這種回圈可以是for、until或者while語句構成的回圈。

                break [n]

       continue 語句跳過回圈體中位於它後面的語句,回到本層回圈的開頭,進行下一次回圈。

                continue [n]

       exit 語句用來退出一個Shell程式,並設定退出值。

                exit [n]

 

# 函數的定義和呼叫

# 函數定義

       Shell 函數必須先定義後使用。

[function] 函數名()
{
    命令序列
    [return 返回值]
}

 

# 函數呼叫

       呼叫函數只需要給出函數名,不需要加括號,就像一般命令那樣使用。

函數名 參數1 參數2 …… 參數n