Slide 1

Slide 1 text

趙惟倫 2012 年 6 月 6 日 2025 年 6 月 11 日 BASH BASH (Bourne Again SHell) (Bourne Again SHell) 基礎 基礎 Chinese-OpenDesktop

Slide 2

Slide 2 text

BASH & DASH BASH & DASH "Thomas and Friends"( 湯瑪士小火車)

Slide 3

Slide 3 text

命令殼 命令殼 一種指令稿程式語言,依此寫出的程式稱為命令稿 這種程式語言的實作程式,做為命令稿的解譯器 單獨執行這個程式所進入的讀取- 求值- 印出循環 這個介面所代表的系統階層, 將可執行程式做為命令調用 硬體 內核 函式庫 命令殼 應用程式 作業系統

Slide 4

Slide 4 text

哪裡會出現? 哪裡會出現? 執行每一個命令稿時 主控臺、虛擬終端機 終端機仿真器 視窗外框 ( 由視窗管理器產生) 外部命令輸出 內建命令輸出 命令殼循環輸出 視窗背景 ( 由終端機仿真器產生) 外部輸入

Slide 5

Slide 5 text

種類 種類 #!/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 預設命令殼程式是使用者資料的設定項目之一

Slide 6

Slide 6 text

命令列 命令列 提示符號代表命令殼已準備好接受下一列指令輸入 支援基本編輯鍵、歷史[↑][↓] 、補完[ ] ⭾ 、搜尋 [Ctrl-R] 、回溯[Alt-.] 、清空[Ctrl-U] 英數字以外有特殊語法意義的符號稱為中繼字元,其中 備註符號:井字號# 後方所有字元視為備註 限制符號:雙引號對"..." 遮蔽" \ ` $ ! 以外所有中繼字元; 單引號對'...' 遮蔽' 以外所有中繼字元; 錢號加單引號對$'...' 遮蔽' 以外所有中繼字元且視為C 字串 逸出符號:反斜線\ 遮蔽後方單一中繼字元 每列都要經過前處理語法剖析才會真正被執行

Slide 7

Slide 7 text

語法剖析 語法剖析 (1) (1) 檢查賦值定義 簡單指令為任意項賦值定義加上零或一項命令與引數群 [ 賦值定義 ]... [ 命令 [ 引數 ]...] 賦值定義的等號= (或+= )前後不可有分隔符號 變數名稱 = 變數值 單獨的賦值定義會影響目前的命令殼環境;前置於命令 的賦值定義衹會影響執行該命令的子行程環境;變數預 設為非全域而無繼承性質

Slide 8

Slide 8 text

語法剖析 語法剖析 (2) (2) 檢查複合命令 複合命令括住的指令群可寫在同一列,跨越多列時互動 介面會出現次層提示符號 區塊符號:小括號對( 指令群 ) ;大括號對{ 指令群 ;} 條件命令:case 字組 in [ 胚騰 ) 指令群 ;;]... ;esac ; if 條件 ;then 指令群 [;elif 條件 ] [;else 指令群 ] ;fi 迴圈命令:while 條件 ;do 指令群 ;done ; for 變數名稱 in 列表 ;do 指令群 ;done (中間可使用break, continue )

Slide 9

Slide 9 text

語法剖析 語法剖析 (3) (3) 結合多重指令 利用結合符號區分多重指令的左側與右側(或次列) 結合較弱、先被分割的符號 分號; :先執行左側指令,結束後執行右側指令 和號& :將左側指令移入背景執行,不待結束即執行右側指令 結合較強、後被分割的符號 雙直線|| :先執行左側指令,結束異常才會執行右側指令 雙和號&& :先執行左側指令,結束正常才會執行右側指令

Slide 10

Slide 10 text

語法剖析 語法剖析 (4) (4) 輸出入管線重導 所有開啟做為輸出入的檔案都有編號 0 :標準輸入;1 :標準輸出;2 :標準錯誤輸出 程式的預設標準輸出入為虛擬的終端機裝置 管線符號:直線| 將左側指令輸出轉為右側指令輸入 重導符號:大於> 將左側指令輸出轉為右側檔案內容; 小於< 將右側檔案內容轉為左側指令輸入 擴充符號包括 |&, 2>, &>, >>, <<, <<<

Slide 11

Slide 11 text

語法剖析 語法剖析 (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

Slide 12

Slide 12 text

語法剖析 語法剖析 (6) (6) 代換指令輸出 執行以代換指令符號(兩組同樣功能)所括住的指令群 反引號對 ` 指令群 ` 相容性較高 錢號加小括號對 $( 指令群 ) 支援巢狀結構 將該部分代換為執行後的標準輸出(尾端去除換列) $(( 運算式 )) 代換為數學運算式的整數結果,隱含變數 代換操作

Slide 13

Slide 13 text

語法剖析 語法剖析 (7) (7) 變數代換為值 代換${ 變數名稱 } 或無歧義時僅前綴$ 的變數值 代換擴充功能${ 變數名稱功能符號功能參數 } 功能符號:: :- := # ## % %% ^ ^^ , ,, / // /# /% 其他擴充${# 變數名稱 } ;${ 變數名稱 [ 索引 ]} 環境變數必須要匯出後才會成為全域變數 重要全域變數值 $HOME, $USER, $PATH, $PWD, $PS1, $LANG, $DISPLAY $CDPATH, $TERM, $EDITOR

Slide 14

Slide 14 text

語法剖析 語法剖析 (8) (8) 擴展路徑名稱 萬用字元會進行檔案及目錄的名稱萬用匹配 * :任意個字元 ? :任一個字元 [ 字串 ] 或[ 字元 - 字元 ] :任一個其中字元 [! 字串 ] 或[! 字元 - 字元 ] :任一個非其中字元 其他名稱擴展 ~ :代換為主目錄(應用時波浪號僅在字組首字母有效) 以alias 命令加賦值定義設定(應用時別名僅在首字組有效) 以function 命令定義函式名稱(應用時如同命令名稱)

Slide 15

Slide 15 text

語法剖析 語法剖析 (9) (9) 分隔字組 根據空格、跳格、換列等分隔符號來分隔字組 除了變數名稱首字元以外,數字視同文字 脫去已完成功能的限制符號與逸出符號 首個非賦值定義的字組即為命令,後方均為引數 引數可區分為選項(可能性有限、常以短橫線前綴)或 參數(可能性無限、避免以短橫線前綴)

Slide 16

Slide 16 text

執行命令 執行命令 依據命令類型而有不同的執行機制 內建命令:直接調用命令殼內部常式 外部命令:非內建命令的基底名稱會依$PATH 變數值路徑順序尋找 二進位執行檔-以鏈結函式庫載入後執行 指令稿-以自身首列井歎符號#! 指定的程式去讀取與執行 命令執行結束後會送出退出代碼 0 表示真(正常);1~255 表示假(異常) if 與while 後方的條件取決於指令的退出代碼 指令群的退出代碼即為最後指令的退出代碼,除非以|| 或&& 結合 [Ctrl-C] 強制結束訊號;[Ctrl-D] 檔案末尾字元

Slide 17

Slide 17 text

命令行程 命令行程 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

Slide 18

Slide 18 text

子命令殼 子命令殼 & 與( 指令群 ) 行程圖中的bash' 表示子命令殼 單純執行內建命令並不會叉生子命令殼 管線符號兩側的指令分別會進入子命令殼 代換指令輸出是在子命令殼中執行 更動子命令殼中的環境變數不會影響上層

Slide 19

Slide 19 text

常用命令 常用命令 變數、條件 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, xargs, seq, tee, expr, let, bc, true(:), false

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

謝謝各位 敬請指教 簡報模板:資訊未來大自由 ( 孫賜萍 )