《bash 網路安全運維》 bash 入門
阿新 • • 發佈:2021-01-12
條件語句
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
}
需要注意的點:
- 除非在函式中使用 local 內建指令進行宣告,否則變數的作用域是全域性的。一個設定了變數 i 並且在迴圈中針對 i 值進行自動增長的 for 迴圈,可能會把程式碼中其他地方設定的 i 的值弄亂。
- 大括號是用來區分函式體範圍的最常用的語法,但是任何 shell 的複合命令語法都是允許的。
- 在大括號中重定向輸入/輸出可以對函式內的所有語句執行此操作。
- 函式定義中沒有宣告任何引數。使用多少個以及什麼樣的引數是在函式呼叫時傳遞給它的。
bash 中的模式匹配
當我們需要在命令列中命名許多檔案時,不需要鍵入每個檔案的名稱。 bash 提供模式匹配,可以使用模式指定一組檔案。
- *:可以匹配任意數量的字元。
- ?:匹配單個字元。
- []:使用方括號中列出的任何字元進行匹配。
字元類 | 描述 |
---|---|
[:alnum:] | 字母數字 |
[:alpha:] | 字母 |
[:ascii:] | ASCII |
[:blank:] | 空格和製表符 |
[:ctrl:] | 控制字元 |
[:dight:] | 數字 |
[:graph:] | 除了控制字元和空格之外的任意字元 |
[:lower:] | 小寫字母 |
[:print:] | 除了控制字元之外的任何字元 |
[:punct:] | 標點符號 |
[:space:] | 包含換行符的空白字元 |
[:upper:] | 大寫字母 |
[:word:] | 字母、數字和下劃線 |
[:xdigit:] | 十六進位制 |
使用 shell 模式匹配時,需要注意幾點:
- 模式不是正則表示式,不要混淆兩者。
- 模式是與檔案系統中的檔案相匹配的;如果模式以路徑名開頭,則將對該目錄中的檔案進行匹配。
- 如果沒有匹配上模式,shell 將會使用特殊模式匹配字元作為檔名的文字字元。也就是將會建立一個檔名包含特殊模式匹配字元的檔案,當我們要刪除這個檔案時注意用 “\” 轉義特殊模式匹配字元。
- 在引號內將不會進行模式匹配。