「緯育 2026-0417」修訂間的差異
出自頂極製作所
| 行 32: | 行 32: | ||
* 效益:節省人力、降低電費、提升 IT 管理效率;鼓勵擴充系統工具指令庫使腳本更精簡高效。 | * 效益:節省人力、降低電費、提升 IT 管理效率;鼓勵擴充系統工具指令庫使腳本更精簡高效。 | ||
[[檔案:2026-0417-01.png|800px]] | [[檔案:2026-0417-01.png|800px]] | ||
=== Shell的類型與基本操作 === | |||
* 不同Shell的發展 | |||
** 介紹了CSH、D-CSH、KASH等序列,並說明本課程主要使用Bash,它是GNU專案的軟體,也是多數Linux發行版的預設Shell。 | |||
* Bash的相容性與優點 | |||
** Bash與SH(Bourne Shell)高度相容(99.9%),為SH寫的腳本基本都能在Bash中執行。 | |||
** Bash融合了CSH、KSH等Shell的優點,提供別名(Alias)、工作控制(Job Control)、命令列歷史回看與編輯等便利功能。 | |||
* Shell的登入、變更與登出 | |||
** 登入:使用者登入系統後,會自動進入預設的Shell。 | |||
** 變更:可透過輸入Shell名稱(如bash)暫時變更,或使用chsh指令、編輯/etc/passwd檔案來永久變更預設Shell。 | |||
** 登出:可使用exit、logout指令或Ctrl+D快速鍵。 | |||
=== Bash常用快速鍵與功能 === | |||
* 游標移動 | |||
** Ctrl+B/Ctrl+F:向後/向前移動一個字元(同方向鍵)。 | |||
** Ctrl+A/Ctrl+E:移動到行首/行尾(同Home/End鍵)。 | |||
* 指令歷史 | |||
** Ctrl+R:反向增量搜尋(reverse-i-search),輸入關鍵字片段即可查找最近的歷史指令。 | |||
** !!:重複執行上一條指令。 | |||
* 畫面與程序控制 | |||
** Ctrl+L:清除畫面(同clear指令)。 | |||
** Ctrl+Z:將前景程序放到背景並暫停(工作控制)。 | |||
** Ctrl+D:離開Shell(同exit),若命令列為空則觸發登出。 | |||
* 文字刪除與輸入 | |||
** Ctrl+H:刪除游標前的字元(同Backspace)。 | |||
** Ctrl+D:刪除游標所在的字元(同Delete),若命令列非空。 | |||
** Ctrl+M:執行指令(同Enter)。 | |||
* 命令列補全 | |||
** Tab鍵:自動補全指令、檔名或路徑。 | |||
* Shell 選項管理 (shopt) | |||
** shopt指令用於設定或取消Bash的行為選項。 | |||
** shopt -p:列出所有選項及其狀態。 | |||
** shopt -s [選項]:啟用選項;shopt -u [選項]:停用選項。 | |||
** 範例:cdspell:啟用後(shopt -s cdspell),cd指令能自動校正輕微的目錄拼寫錯誤。 | |||
=== Shell設定檔與啟動流程 === | |||
* 設定檔分類 | |||
** 公共設定檔:位於/etc,對所有使用者生效(如/etc/profile, /etc/bash.bashrc)。 | |||
** 私用設定檔:位於使用者家目錄~,僅對該使用者生效(如~/.bashprofile, ~/.bashrc)。 | |||
* 登入模式分類 | |||
** Login Shell:需完整身份驗證的登入(如Console登入、su -)。 | |||
** Non-login Shell:在已登入環境下開啟的新Shell(如圖形介面終端機、su)。 | |||
* 設定檔載入順序 | |||
** Login Shell: | |||
1. /etc/profile (及其呼叫的/etc/profile.d/*.sh) | |||
2. ~/.bashprofile -> ~/.bashlogin -> ~/.profile (三選一,找到即停) | |||
3. ~/.bashprofile 通常會主動呼叫 ~/.bashrc。 | |||
** Non-login Shell: | |||
1. /etc/bash.bashrc | |||
2. ~/.bashrc | |||
* 驗證啟動流程 | |||
** 可在各設定檔第一行加入echo "檔案名稱",重新登入後觀察輸出順序來驗證。 | |||
* 利用啟動檔進行安全監控 | |||
** 可在共通執行的設定檔(如.bashrc)中加入腳本,實現如「root帳號登入時寄信通知」或「限制非上班時間登入」等安全措施。 | |||
=== Shell環境個人化設定 === | |||
* 指令別名 (Alias) | |||
** 通常設定在~/.bashrc中,例如alias cls='clear'。 | |||
* 歷史指令 (History) 設定 | |||
** HISTSIZE:設定記憶體中保留的指令筆數。 | |||
** HISTFILESIZE:設定歷史紀錄檔 (~/.bashhistory) 中保存的筆數。 | |||
** HISTTIMEFORMAT="[%F %T] ":設定後,history指令會顯示每條指令的執行時間戳。此資訊會以Unix時間戳格式儲存在.bashhistory中。 | |||
* 視窗尺寸自動檢查 (checkwinsize) | |||
** 啟用shopt -s checkwinsize後,Shell會自動更新LINES和COLUMNS變數,方便腳本根據視窗大小調整輸出。 | |||
* Vim編輯器設定 | |||
** 可在家目錄建立.vimrc檔案,進行個人化設定,如顯示行號。 | |||
=== 指令結構、類型與執行順序 === | |||
* 指令基本結構 | |||
** Command [Option] [Argument],各部分以空白隔開。 | |||
* 選項 (Options) 類型 | |||
** 長選項 (Long Option):--開頭,單字形式(如--help),可讀性高,推薦用於腳本。 | |||
** 短選項 (Short Option):-開頭,單一字母(如-h),可合併使用(如-la)。 | |||
* 指令類型 | |||
** 內建指令 (Built-in):內建於Shell本身,執行效率高(如cd, echo, alias)。使用help [指令]查詢。 | |||
** 外部指令 (External):獨立於Shell的執行檔,存放於檔案系統中(如/usr/bin/ls)。使用man [指令]或[指令] --help查詢。 | |||
* 查詢與管理指令 | |||
** type [指令]:判斷指令是內建或外部,並顯示外部指令路徑。 | |||
** whereis [指令]:查詢指令位置,可輔助判斷類型。 | |||
** enable [-n] [指令]:啟用或停用內部指令,可用於權限限制。 | |||
* 指令執行優先順序 | |||
1. 路徑指定:含路徑的指令最優先(如/bin/ls)。 | |||
2. 別名 (Alias):其次執行已設定的別名。 | |||
3. 內建指令:接著檢查是否為Shell內建指令。 | |||
4. PATH環境變數:最後依序在$PATH變數定義的目錄中尋找外部指令。 | |||
=== 檔案類型判別機制 === | |||
* Linux vs. Windows 的差異 | |||
** Windows:主要依賴「副檔名」來識別檔案類型。 | |||
** Linux:主要依賴檔案的「內容」來識別,副檔名僅為人類辨識方便。 | |||
* file指令與Magic Number | |||
** file指令透過讀取檔案開頭的幾個位元組(Bytes),即「Magic Number」,來判斷檔案類型。 | |||
** 系統維護一個magic資料庫檔案(如/usr/share/file/magic),記錄了各種檔案類型與其對應的Magic Number。 | |||
** file指令將讀取到的Magic Number與此資料庫比對,從而準確回報檔案類型,不受副檔名影響。 | |||
[[檔案:2026-0417-02.png|800px]] | |||
於 2026年4月17日 (五) 09:34 的修訂
SHELL SCRIPT 基礎課程
本課程為以 Bash 為主的殼層腳本(Shell Script)與文字介面操作入門與進階實務,結合系統管理與自動化案例,從指令基礎、I/O 與重導向、變數與環境變數、引號與命令替換、條件判斷與迴圈,到陣列、函式、腳本模組化與參數/環境傳遞,逐步建立腳本設計能力。
課程強調以實務需求驅動學習:如多環境一鍵切換配置與下班後遠端自動掃描關機節能;並穿插常用網路/文字/排序/統計/時間指令複習與亂數應用(文字小遊戲)。同時說明 Shell 與作業系統、核心(Kernel)、硬體協作的完整流程,輔以 MP3 播放案例理解系統資源調度。提供虛擬化環境與多平台(macOS、Windows/WSL、VM)操作建議、教材與範例的取得方式(教室直接使用或家庭下載、WiFi 位址分享),以及作業繳交規範與評分策略。因課程模組與歷史課程部分重疊,將集中講解重點並對不熟悉處加強,3C 保證講完,3-2 即使未完整講授亦可憑已學指令自學完成。
Shell 與系統基礎
- Shell 定義與職責:為文字型介面,負責語法解析、建立使用者環境(環境變數/區域變數)、將工作委派給作業系統,再由核心調度硬體並回傳結果訊息。
- 三層架構與指令解析:Shell(上層)解析主指令、選項與引數,交由 OS/Kernel(中層)調度底層硬體;以 MP3 播放示例說明記憶體分配、檔案讀取、解碼庫載入、CPU 執行至音訊輸出。
- 常見 Shell 與通用性:sh、bash、csh、tcsh、ksh、zsh 等;課程以 bash 為主,macOS 可切換 bash,Windows 建議使用 WSL 或虛擬機。
- 檢查與設定 Shell:echo $SHELL 檢視;/etc/passwd 查/改預設 Shell;/etc/shells 列出已安裝 Shell。Bash 4.0 前有重大漏洞,建議更新至新版(範例 5.0.17 或以上)。
- 工作/程序管理:前景/背景切換與持續化;screen 或 tmux 保持工作不中斷。
指令基礎與 I/O
- 標準輸出與重導向:stdout 與 >、>> 等運用,結合各題情境練習;可同時輸出至終端與檔案。
- 引號與命令替換:單引號不展開變數與命令;雙引號展開變數(通配符多不展開);反引號(`)或 $( ) 進行命令替換,將結果嵌入字串。
- 指令查詢、設定與快捷鍵:熟悉查用法、選項;練習快捷鍵以提升效率。路徑(相對/絕對)與 alias 概念提供補充資源。
- 檔案類型判別:Linux 以內容判別(file 等),對比 Windows 依副檔名,避免格式誤判。
變數、字串處理與資料結構
- 變數與環境變數:建立、讀取、使用、unset。以環境變數作為資料傳遞機制可減少參數傳遞負擔。
- 「變數的計算」=字串處理:關鍵字檢查、比對、替換、刪改等,用於資料清洗與條件觸發,非純數值運算。
- 陣列:改善多值資料處理,縮短程式碼並提升可讀性。
腳本入門、流程控制與模組化
- 第一支腳本(Hello World):建立語法與執行習慣,重視可讀性與流程。
- 判斷式與迴圈:if/case 決策分支;for/while 迴圈設計與中斷條件,避免無窮迴圈(特別在雲端/遠端環境)。
- 邏輯寫法風格:test/ vs []、-a/-o vs &&/|| 等,先選一種熟悉風格;遇表達困難可切換以簡化思路。
- 函式:定義、呼叫、參數與回傳、提前返回;概念與 Python 相近、語法不同。
- 腳本間呼叫與傳遞:多腳本拆分職責;以參數或預設環境變數(如 minet)傳遞資料,視可讀性與維運需求選用。
常用工具與亂數應用
- 指令複習:網路/文字處理/排序/統計/時間等已學工具,持續整合於實作。
- 亂數與文字小遊戲:擲骰子、丟硬幣、猜數字(1–100),以已學指令組合完成,強化控制流程與 I/O 綜合運用。
實務自動化案例
- 多環境快速切換腳本:在不同公司/環境間一鍵切換網路與文字配置,提供選單(A、B、1、2、3 等),避免重複輸入 ifconfig/ip/帳號等,結合工具或自製指令組快速套用設定。
- 節能關機自動化:對公司 Linux 主機以腳本排程(如 18:00)進行遠端掃描(ping 存活)、連線並下達 PowerOff,延遲再檢查確認關機;可視覺監控或離席後回來確認。亦評估商用集中管理軟體之可行性與成本。
- 效益:節省人力、降低電費、提升 IT 管理效率;鼓勵擴充系統工具指令庫使腳本更精簡高效。
Shell的類型與基本操作
- 不同Shell的發展
- 介紹了CSH、D-CSH、KASH等序列,並說明本課程主要使用Bash,它是GNU專案的軟體,也是多數Linux發行版的預設Shell。
- Bash的相容性與優點
- Bash與SH(Bourne Shell)高度相容(99.9%),為SH寫的腳本基本都能在Bash中執行。
- Bash融合了CSH、KSH等Shell的優點,提供別名(Alias)、工作控制(Job Control)、命令列歷史回看與編輯等便利功能。
- Shell的登入、變更與登出
- 登入:使用者登入系統後,會自動進入預設的Shell。
- 變更:可透過輸入Shell名稱(如bash)暫時變更,或使用chsh指令、編輯/etc/passwd檔案來永久變更預設Shell。
- 登出:可使用exit、logout指令或Ctrl+D快速鍵。
Bash常用快速鍵與功能
- 游標移動
- Ctrl+B/Ctrl+F:向後/向前移動一個字元(同方向鍵)。
- Ctrl+A/Ctrl+E:移動到行首/行尾(同Home/End鍵)。
- 指令歷史
- Ctrl+R:反向增量搜尋(reverse-i-search),輸入關鍵字片段即可查找最近的歷史指令。
- !!:重複執行上一條指令。
- 畫面與程序控制
- Ctrl+L:清除畫面(同clear指令)。
- Ctrl+Z:將前景程序放到背景並暫停(工作控制)。
- Ctrl+D:離開Shell(同exit),若命令列為空則觸發登出。
- 文字刪除與輸入
- Ctrl+H:刪除游標前的字元(同Backspace)。
- Ctrl+D:刪除游標所在的字元(同Delete),若命令列非空。
- Ctrl+M:執行指令(同Enter)。
- 命令列補全
- Tab鍵:自動補全指令、檔名或路徑。
- Shell 選項管理 (shopt)
- shopt指令用於設定或取消Bash的行為選項。
- shopt -p:列出所有選項及其狀態。
- shopt -s [選項]:啟用選項;shopt -u [選項]:停用選項。
- 範例:cdspell:啟用後(shopt -s cdspell),cd指令能自動校正輕微的目錄拼寫錯誤。
Shell設定檔與啟動流程
- 設定檔分類
- 公共設定檔:位於/etc,對所有使用者生效(如/etc/profile, /etc/bash.bashrc)。
- 私用設定檔:位於使用者家目錄~,僅對該使用者生效(如~/.bashprofile, ~/.bashrc)。
- 登入模式分類
- Login Shell:需完整身份驗證的登入(如Console登入、su -)。
- Non-login Shell:在已登入環境下開啟的新Shell(如圖形介面終端機、su)。
- 設定檔載入順序
- Login Shell:
1. /etc/profile (及其呼叫的/etc/profile.d/*.sh) 2. ~/.bashprofile -> ~/.bashlogin -> ~/.profile (三選一,找到即停) 3. ~/.bashprofile 通常會主動呼叫 ~/.bashrc。
- Non-login Shell:
1. /etc/bash.bashrc 2. ~/.bashrc
- 驗證啟動流程
- 可在各設定檔第一行加入echo "檔案名稱",重新登入後觀察輸出順序來驗證。
- 利用啟動檔進行安全監控
- 可在共通執行的設定檔(如.bashrc)中加入腳本,實現如「root帳號登入時寄信通知」或「限制非上班時間登入」等安全措施。
Shell環境個人化設定
- 指令別名 (Alias)
- 通常設定在~/.bashrc中,例如alias cls='clear'。
- 歷史指令 (History) 設定
- HISTSIZE:設定記憶體中保留的指令筆數。
- HISTFILESIZE:設定歷史紀錄檔 (~/.bashhistory) 中保存的筆數。
- HISTTIMEFORMAT="[%F %T] ":設定後,history指令會顯示每條指令的執行時間戳。此資訊會以Unix時間戳格式儲存在.bashhistory中。
- 視窗尺寸自動檢查 (checkwinsize)
- 啟用shopt -s checkwinsize後,Shell會自動更新LINES和COLUMNS變數,方便腳本根據視窗大小調整輸出。
- Vim編輯器設定
- 可在家目錄建立.vimrc檔案,進行個人化設定,如顯示行號。
指令結構、類型與執行順序
- 指令基本結構
- Command [Option] [Argument],各部分以空白隔開。
- 選項 (Options) 類型
- 長選項 (Long Option):--開頭,單字形式(如--help),可讀性高,推薦用於腳本。
- 短選項 (Short Option):-開頭,單一字母(如-h),可合併使用(如-la)。
- 指令類型
- 內建指令 (Built-in):內建於Shell本身,執行效率高(如cd, echo, alias)。使用help [指令]查詢。
- 外部指令 (External):獨立於Shell的執行檔,存放於檔案系統中(如/usr/bin/ls)。使用man [指令]或[指令] --help查詢。
- 查詢與管理指令
- type [指令]:判斷指令是內建或外部,並顯示外部指令路徑。
- whereis [指令]:查詢指令位置,可輔助判斷類型。
- enable [-n] [指令]:啟用或停用內部指令,可用於權限限制。
- 指令執行優先順序
1. 路徑指定:含路徑的指令最優先(如/bin/ls)。 2. 別名 (Alias):其次執行已設定的別名。 3. 內建指令:接著檢查是否為Shell內建指令。 4. PATH環境變數:最後依序在$PATH變數定義的目錄中尋找外部指令。
檔案類型判別機制
- Linux vs. Windows 的差異
- Windows:主要依賴「副檔名」來識別檔案類型。
- Linux:主要依賴檔案的「內容」來識別,副檔名僅為人類辨識方便。
- file指令與Magic Number
- file指令透過讀取檔案開頭的幾個位元組(Bytes),即「Magic Number」,來判斷檔案類型。
- 系統維護一個magic資料庫檔案(如/usr/share/file/magic),記錄了各種檔案類型與其對應的Magic Number。
- file指令將讀取到的Magic Number與此資料庫比對,從而準確回報檔案類型,不受副檔名影響。