Upgrade to Pro — share decks privately, control downloads, hide ads and more …

BASH Basics

BASH Basics

Avatar for 趙惟倫

趙惟倫

June 11, 2025
Tweet

More Decks by 趙惟倫

Other Decks in Programming

Transcript

  1. 趙惟倫 <bluebat@member.fsf.org> 2012 年 6 月 6 日 2025 年

    6 月 11 日 BASH BASH 基礎 基礎 Chinese-OpenDesktop
  2. 種類 種類 #!/usr/bin/fish for i in (seq 1 2 5)

    set j (math $i+1) echo $i\t$j end #!/usr/bin/fish for i in (seq 1 2 5) set j (math $i+1) echo $i\t$j end sh ash tcsh ksh dash bash csh zsh fish #!/usr/bin/tcsh foreach i (1 3 5) @ j = $i + 1 echo "$i\t$j" end #!/usr/bin/tcsh foreach i (1 3 5) @ j = $i + 1 echo "$i\t$j" end #!/usr/bin/bash for i in {1..5..2} do let j=i+1 echo $i$'\t'$j done #!/usr/bin/bash for i in {1..5..2} do let j=i+1 echo $i$'\t'$j done
  3. 命令列 命令列 預設命令殼程式是使用者資料的設定項目之一 提示符號代表命令殼已準備好接受下一列指令輸入 支援基本編輯鍵、指令歷史[↑][↓] 、指令補完[ ] ⭾ 、 反向搜尋[Ctrl-R]

    、字組回溯[Alt-.] 英數字以外有特殊語法意義的符號稱為中繼字元,其中 備註符號:井字號# 後方所有字元視為備註 限制符號:單引號對'...' 遮蔽除了' 以外所有中繼字元; 雙引號對"..." 遮蔽除了" \ ` $ ! 以外所有中繼字元 逸出符號:反斜線\ 遮蔽後方單一中繼字元 每列都要經過前置語法剖析才會真正被執行
  4. 語法剖析 語法剖析 (1) (1) 檢查賦值敘述 簡單指令為零至多項賦值敘述加上零或一項命令與引數 [ 賦值敘述 ]* [

    命令 [ 引數 ]*]? 賦值敘述的等號= (或+= )前後必須沒有分隔符號 變數名稱 = 變數值 單獨的賦值敘述會影響目前的命令殼環境;隨附指令的 賦值敘述衹會影響執行該指令的子行程環境;變數預設 為非全域而無繼承性質
  5. 語法剖析 語法剖析 (2) (2) 檢查複合命令 複合命令包含的指令群可寫在同一列,跨越多列時互動 介面會出現次層提示符號 區塊符號:小括號對( 指令群 )

    ;大括號對{ 指令群 ;} 條件指令:case 字組 in [ 字組 ) 指令群 ;;]... ;esac ; if 條件 ;then 指令群 [;elif 條件 ] [;else 指令群 ] ;fi 迴圈指令:while 條件 ;do 指令群 ;done ; for 變數名稱 in 列表 ;do 指令群 ;done (中間可使用break, continue )
  6. 語法剖析 語法剖析 (3) (3) 分割多重指令 利用分割符號區分多重指令的左側與右側(或次列) 結合較弱、先被分割的符號 分號; :先執行左側指令,結束後執行右側指令 和號&

    :將左側指令移入背景執行,不待結束即執行右側指令 結合較強、後被分割的符號 雙直線|| :先執行左側指令,結束異常才會執行右側指令 雙和號&& :先執行左側指令,結束正常才會執行右側指令
  7. 語法剖析 語法剖析 (4) (4) 輸出入管線重導 所有開啟做為輸出入的檔案都有編號 0 :標準輸入;1 :標準輸出;2 :標準錯誤輸出

    程式的預設標準輸出入為虛擬的終端機裝置 管線符號:直線| 將左側指令輸出轉為右側指令輸入 重導符號:大於> 將左側指令輸出轉為右側檔案內容; 小於< 將右側檔案內容轉為左側指令輸入 擴充符號包括 |&, 2>, &>, >>, <<, <<<
  8. 語法剖析 語法剖析 (5) (5) 擴展列表字組 展開{ 字組一 , 字組二 [,

    字組三 ]...} 類型的列表 展開{ 英數字一 .. 英數字二 [.. 數字三 ]} 類型的列表 user$ echo file{1,3,2} file1 file3 file2 user$ echo item{1..5..2} item1 item3 item5 user$ echo name{E..A..2} nameE nameC nameA
  9. 語法剖析 語法剖析 (6) (6) 代換指令輸出 執行以代換指令符號(兩組同樣功能)所括住的指令 反引號對 ` 指令群 `

    相容性較高 錢號加小括號對 $( 指令群 ) 支援巢狀結構 該部分代換為所執行指令的標準輸出(尾端去除換列)
  10. 語法剖析 語法剖析 (7) (7) 變數代換為值 代換${ 變數名稱 } 或無歧義時僅前導$ 的變數值

    代換擴充功能${ 變數名稱功能符號功能參數 } 功能符號:: :- := # ## % %% ^ ^^ , ,, / // /# /% 其他擴充${# 變數名稱 } ;${ 變數名稱 [ 索引 ]} 環境變數必須要匯出後才會成為全域變數 重要初始全域變數 $HOME, $USER, $PATH, $PWD, $PS1, $LANG, $DISPLAY $RANDOM, $LD_PRELOAD
  11. 語法剖析 語法剖析 (8) (8) 擴展路徑名稱 匹配符號會進行檔案及目錄的名稱萬用匹配 * :任意個字元 ? :任一個字元

    [ 字串 ] :其中任一個字元 [! 字串 ] :任一個非其中字元 其他名稱擴展 ~ :代換為家目錄(應用時波浪號僅在字組首字母有效) 以alias 命令加賦值敘述設定(應用時別名僅在首字組有效) 以function 命令定義函式名稱(應用時如同命令名稱)
  12. 命令行程 命令行程 user$ cmd user$ cmd ; user$ (cmd) user$

    cmd & user$ exec cmd user$ source cmd.sh bash cmd bash cmd bash' bash cmd bash bash bash cmd bash' bash bash cmd1 bash cmd2 cmdN user$ . cmd.sh
  13. 常用命令 常用命令 變數與條件相關 eval, set, export, env, unset, test([ ...

    ]), [[ ... ]] 檔案目錄相關 touch, ln, mkdir, cp, rm, rmdir, file, pwd, cd, ls, chown, chmod, mv, more, locate, cat, source(.) 系統資訊相關 date, uname, id, help, type, which, hash, history, man 行程相關 ps, sleep, sync, time, timeout, watch, kill, exec, exit 輸出輸入與數值邏輯 echo, printf, read, seq, expr, let, bc, true(:), false
  14. 進階操作 進階操作 使用檔案工具程式 文字編輯:vi, joe, nano 一般處理:cmp, diff, rsync, xxd,

    rename 正規表示式:grep, sed, awk 編寫命令稿 直接執行要注意檔案路徑與檔案屬性 井歎符號:不可有位元組順序標記;引數數量有限制 特別變數:$?, $#, $0, $1..${10}..., $*, $@, $$, $!, $_ 特別命令:shift, wait, pushd, popd, shopt, readlink