bash,  Research & Study

bash – 基本文法教學 #2

迴圈

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 若有需要更複雜,可以去看看

留下一個回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *