bash – 基本文法教學 #2
16 1 月, 2022
/
迴圈
while
bash 的迴圈寫法,需要透過 “do”和”done”將程式碼包覆起來。
簡單範例
- 透過”let”指令來執行”i++”的運算式
i=0
while (( i<1000 ))
do
echo $i
let i++
done
簡單範例2
while ls | grep -q pdf
do
echo -n ‘there is a pdf in :’
pwd
cd ..
done
簡單範例3
- 透過迴圈處理 shell 的 輸入參數($1、$2、$3)
- ARG 可以替換成任何變數
for ARG
do
echo here is an argument : $ARG
done
簡單範例4
- 可以直接將變數寫在後面
- 分別依序依序輸出”20″、”3″、”dog”、”peach”、”7″、”vanilla”
For VAL in 20 3 dog peach 7 vanilla
do
exho $VAL
done
簡單範例5
For VAL in $(ls | grep pdf) {0..5}
do
exho $VAL
done
大括弧 可以用來產生數字
其公式 如 {first…last…step}
後面Step 部分 可有可無
first數字部分可以透過補0來確認長度
EX: {050…123}
會產生50~123的數列,且50的表示方法為050
函式
函式語法
function HelloWorld()
{
echo Hello World
}
function HelloWorld
{
echo Hello World
}
HelloWorld()
{
echo Hello World
}
傳遞變數
- 除非已在函式中內建指令宣告,所有變數都是全域變數
- 傳遞的參數,定義函數時不需要宣告參數
- 若有一個 subshell 的函式,傳給他三個參數,範例如下
- subshell ‘HELLO WORLD’ /TEST 123
- 若在 函數需要使用指令搞原本的參數,需要先將$1參數 存進變數中
- 其他參數以此類推,唯一例外
$0
- 其他參數以此類推,唯一例外
回傳值
- 0 為正常
- 非0 為錯誤
- 若需要回傳資料,設立全域變數即可
- 在函數中建立的參數都是全域變數
- 特別宣告局部變數除外
管線
- 如果函式會印出答案,必須把輸出當成管線的一部分
- eg:func args | next step | etc
- 將輸出捕捉下來
- RETVAL=( myfunc args )
在上面的情況中,函式都會被放到一個subshell中執行,而非一開始的shell,所以在subshell 中的全域變數的變化都不會反映到原本的shell 中
樣式比對
在需要針對大量檔案進行指名時,可以透過 Bash 提供的樣式比對來進行數個檔案的指名。
比對重點
- 樣式不等於正規化
- 樣式是用來比對檔名用 (若有比對內容中有路徑,比對範圍僅限目錄下的檔案)
特殊檔案
- echo data > /tmp/*.out
* 若 tmp 目慮下有結尾是 .out 的檔案, 就會輸入到 該點案裡面。 - 若 tmp 目綠下沒有結尾是 .out 的檔案,就會建立一個 *.out 的檔案。
- 若要移除需要輸入 rm /tmp/\*.out
- 字元是特殊字元,需要透過反斜線來著名
- 樣式比對 對引號內無效(包含單引號和雙引號)
- 會講引號中的內容當成一個檔案
- echo data > “/tmp/*.out”
- 建立一個名字是 /tmp/*.out 的檔案
萬用字元:`*`
- 可以表達任意數量的任何字元
- 可以和其他字元合併
- 舉例:*.pdf 可以找到 test.pdf 和 hello.pdf
問號:`?`
- 比對單一字元
- 一個問號對應一個字元
- 舉例: ????.pdf 可以找到 test.pdf 但不會找到 hello.pdf
中括弧:`[]`
比對中括弧指定的條件
- [abcd]:針對特定單字,只有abcd這四個單字
- [0-9]:針對特定範圍,0~9的數字
- [!0-9] or [^0-9]:反向符號,不抓有 0~9 的 檔案
- [:alnum:]:數字和字母字元
- [:alpha:]:純字母字元
- [:ascii:]:ASCII 字元
- [:blank:]:空白和 tab 字元
- [:ctrl:]:控制字元
- [:digit:]:數字字元
- [:graph:]:任何控制和空白字元以外的字元
- [:lower:]:小寫字母
- [:print:]:任何控制字元以外的字元
- [:punct:]:標點符號字元
- [:space:]:空白字元(包含換行符號)
- [:upper:]:大寫字母
- [:word:]:字母、數字和底線字元
- [:xdigit:]:十六進位字元
舉例
舉例: [[:punct:]]jpg
- 可以找到 wow!jpg、some,jpg、photo.jpg
- 但是找不到 this.is.myjpg (因為jpg沒有標點符號)
extglob 若有需要更複雜,可以去看看