1. 程式人生 > 實用技巧 >《bash 網路安全運維》 bash 入門

《bash 網路安全運維》 bash 入門

條件語句

bash 使用 0 表示真,使用非 0 表示假,它的意義在於程式的返回值是錯誤程式碼,能夠解釋程式為什麼失敗。當返回 0 時說明執行成功,當返回其他非 0 值時對應著不同的錯誤原因。
if 語句簡單的形式如下:

if cmd
then
      some cmds
else
      other cmds
fi

使用 if 命令更改目錄為 /tmp 的簡單例子:

if cd/tmp
then
      echo "here is what is in /tmp:"
      ls -l
fi

if 的判斷式也可以使用管道形式:

if ls | grep pdf
then
      echo "found one or more pdf files here"
else
      echo "no pdf files found"

對於管道命令來說,管道最後一個命令的成功與失敗決定了是否採用 “true” 分支。

比較

比較時使用的一種更典型的 if 形式時使用複合命令[[或 shell 內建指令 [或 test 命令。

檔案測試符

檔案測試符 使用說明
-d 測試目錄是否存在
-e 測試檔案是否存在
-r 測試檔案是否存在且可讀
-w 測試一個檔案是否存在並且可寫
-x 測試各異檔案是否存在並可執行

如測試檔案系統上是否存在檔案:

if [[ -e $FILENAME ]]
then 
      echo $FILENAME exists
fi

數值測試符

數值測試操作符 使用說明
-eq 檢驗數之間是否相等
-gt 測試一個數字是否大於另一個
-lt 測試一個數字是否小於另一個

如檢驗變數 $VAL 是否小於變數 $MIN:

if [[ $VAL -lt $MIN ]]
then
      echo "value is too small"
fi

雙圓括號

雙圓括號中會假定所有的變數都是數值的,不需要使用 $ 運算子來檢索值。如:

if (( VAL < 12 ))
then
      echo "value $VAL is too small"
fi

迴圈語句

while 迴圈語句類似於 if ,它的判別式也可以使用單一命令或者管道來表示。
while 迴圈的簡單寫法如下:

i = 0
while (( i < 1000 ))
do
      echo $i
      let i++
done

當然判斷式也可以是管道:

while ls | grep -q pdf
do
      echo -n 'there is a file with pdf in its name here: '
      pwd
      cd ..
done

使用雙圓括號可以實現簡單的數值迴圈

for ((i=0; i < 100; i++))
do
      echo $i
done

引數傳遞

for VAL in 20 3 dog peach 7 vanilla
do
      echo $VAL
done

程式會把 “20”、“3”、“dog”、“peach”、“7”、“vanilla” 依次列印到螢幕上。當然 for 中的列表值也可用位置引數 $1、$2、$3 傳遞。
for 迴圈中使用的值也可以通過呼叫其他程式或使用其他 shell 特性生成:

for VAL in $(ls | grep pdf) {0..5}
do
      echo $VAL
done

變數 VAL 將依次接收 ls 通過管道傳輸到 grep 的每個檔案的值,該檔案的檔名包含 pdf,然後接收從 0 到 5 的每個數字。

大括號

大括號可以用來生成數字序列,用法為:
{first..last..step}
語法與 python 的切片類似。

函式

bash 中函式可以這樣定義:

function myfun ()
{
      # body of the function goes here
}

需要注意的點:

  1. 除非在函式中使用 local 內建指令進行宣告,否則變數的作用域是全域性的。一個設定了變數 i 並且在迴圈中針對 i 值進行自動增長的 for 迴圈,可能會把程式碼中其他地方設定的 i 的值弄亂。
  2. 大括號是用來區分函式體範圍的最常用的語法,但是任何 shell 的複合命令語法都是允許的。
  3. 在大括號中重定向輸入/輸出可以對函式內的所有語句執行此操作。
  4. 函式定義中沒有宣告任何引數。使用多少個以及什麼樣的引數是在函式呼叫時傳遞給它的。

bash 中的模式匹配

當我們需要在命令列中命名許多檔案時,不需要鍵入每個檔案的名稱。 bash 提供模式匹配,可以使用模式指定一組檔案。

  1. *:可以匹配任意數量的字元。
  2. ?:匹配單個字元。
  3. []:使用方括號中列出的任何字元進行匹配。
字元類 描述
[:alnum:] 字母數字
[:alpha:] 字母
[:ascii:] ASCII
[:blank:] 空格和製表符
[:ctrl:] 控制字元
[:dight:] 數字
[:graph:] 除了控制字元和空格之外的任意字元
[:lower:] 小寫字母
[:print:] 除了控制字元之外的任何字元
[:punct:] 標點符號
[:space:] 包含換行符的空白字元
[:upper:] 大寫字母
[:word:] 字母、數字和下劃線
[:xdigit:] 十六進位制

使用 shell 模式匹配時,需要注意幾點:

  1. 模式不是正則表示式,不要混淆兩者。
  2. 模式是與檔案系統中的檔案相匹配的;如果模式以路徑名開頭,則將對該目錄中的檔案進行匹配。
  3. 如果沒有匹配上模式,shell 將會使用特殊模式匹配字元作為檔名的文字字元。也就是將會建立一個檔名包含特殊模式匹配字元的檔案,當我們要刪除這個檔案時注意用 “\” 轉義特殊模式匹配字元。
  4. 在引號內將不會進行模式匹配。