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. 趙惟倫 <[email protected]> 2012 年 6 月 6 日 2025 年

    6 月 11 日 BASH BASH (Bourne Again SHell) (Bourne Again SHell) 基礎 基礎 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-.]

    英數字以外有特殊語法意義的符號稱為中繼字元,其中 備註符號:井字號# 後方所有字元視為備註 限制符號:雙引號對"..." 遮蔽" \ ` $ ! 以外所有中繼字元; 單引號對'...' 遮蔽' 以外所有中繼字元; 錢號加單引號對$'...' 遮蔽' 以外所有中繼字元且視為C 字串 逸出符號:反斜線\ 遮蔽後方單一中繼字元 每列都要經過前置語法剖析才會真正被執行
  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 $CDPATH, $TERM, $EDITOR
  11. 語法剖析 語法剖析 (8) (8) 擴展路徑名稱 萬用字元會進行檔案及目錄的名稱萬用匹配 * :任意個字元 ? :任一個字元

    [ 字串 ] 或[ 字元 - 字元 ] :任一個其中字元 [! 字串 ] 或[! 字元 - 字元 ] :任一個非其中字元 其他名稱擴展 ~ :代換為主目錄(應用時波浪號僅在字組首字母有效) 以alias 命令加賦值定義設定(應用時別名僅在首字組有效) 以function 命令定義函式名稱(應用時如同命令名稱)
  12. 執行命令 執行命令 依據命令類型而有不同的執行機制 內建命令:直接調用命令殼內部常式 外部命令:非內建命令的基底名稱會依$PATH 變數值路徑順序尋找 二進位執行檔-以鏈結函式庫載入後執行 指令稿-以首列井歎符號#! 指定的程式去讀取與執行指令稿 命令執行結束後會送出退出代碼

    0 表示真(正常);1~255 表示假(異常) if 與while 後方的條件取決於指令的退出代碼 指令群的退出代碼即為最後指令的退出代碼,除非以|| 或&& 結合 [Ctrl-C] 送出強制結束訊號; [Ctrl-D] 送出檔案末尾字元
  13. 命令行程 命令行程 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
  14. 常用命令 常用命令 變數、條件 eval, set, export, env, unset, test([ ...

    ]), [[ ... ]] 檔案目錄 touch, ln, mkdir, cp, rm, rmdir, file, pwd, cd, ls, chown, chmod, mv, more, tail, df, locate, cat, source(.), mount 系統資訊、行程 date, uname, id, help, type, which, hash, history, man, ps, sleep, sync, time, kill, exec, exit, return, reboot, poweroff 輸出輸入、數值邏輯 echo, printf, read, seq, expr, let, bc, true(:), false
  15. 進階操作 進階操作 檔案工具程式 檔案編輯:vi, nano, joe, hexedit 檔案目錄:rsync, readlink, rename

    檔案內容:wc, cmp, diff, xxd 檔案封裝:tar, gzip, bzip2, xz, zip 正規表示式應用:find, grep, sed, awk 編寫命令稿 直接執行要注意檔案路徑與檔案屬性 井歎符號:不可有位元組順序標記;引數數量有限制 稿用變數值:$?, $#, $0, $1..${10}..., $*, $@, $$, $!, $_ 稿用命令:shift, wait, pushd, popd, shopt 特殊變數值:$RANDOM, $LD_PRELOAD, $LD_LIBRARY_PATH