Skip to main content

Unix 語法筆記

常常網路上複製貼上能動就不管為什麼了,這不是一個好習慣所以紀錄一下常見的語法,這篇文章會慢慢增加並且滾動式修正。

符號列表

1. 管道與重定向

  • |:將前一命令的輸出作為下一命令的輸入。
  • >:將標準輸出覆蓋重定向到文件。
  • >>:將標準輸出追加重定向到文件。
  • <:將文件內容作為標準輸入。
  • 2>:將標準錯誤覆蓋重定向到文件。
  • 2>>:將標準錯誤追加重定向到文件。
  • &>:同時重定向標準輸出和標準錯誤到文件(Bash 4.0+)。
  • |&:將標準輸出和標準錯誤通過管道傳遞。
  • <<:用於多行輸入的 Here Document。
  • <<<:用字串作為標準輸入的 Here String。

2. 條件運算符

  • &&:當前命令成功時執行後續命令。
  • ||:當前命令失敗時執行後續命令。
  • !:否定命令的退出狀態。
  • ;:順序執行多個命令。
  • ;;:結束 case 分支的標記。

3. 括號與組合操作

  • ():在子 Shell 中執行括號內命令。
  • {}:在當前 Shell 中執行命令組。
  • []:條件測試(等同於 test)。
  • [[]]:高級條件測試(支持模式匹配)。
  • (()):整數運算。
  • <():進程替換,將命令輸出作為文件描述符。
  • >():進程替換,將文件描述符作為命令輸入。

4. 變量與替換

  • $:變量展開或命令替換。
  • ${}:變量的高級操作。
  • $(...):命令替換。
  • `...`:舊式命令替換(不推薦)。
  • $#:參數個數。
  • $*:所有參數,作為單一字串展開(由 IFS 分隔)。
  • $@:所有參數,分開列出("$@" 保留原始分隔)。
  • $?:上一命令的退出狀態碼。
  • $$:當前 Shell 的進程 ID。
  • $!:最後執行的後台命令的進程 ID。
  • $-:當前 Shell 的選項狀態。
  • $0:腳本名稱。

5. 通配符與模式匹配

  • *:匹配零個或多個字符。
  • ?:匹配單個字符。
  • []:匹配字符集合。
  • [^]:匹配不在集合中的字符。
  • {}:靜態展開,如 {a,b} 展開為 a b
  • ~:用戶主目錄。

6. 引用與轉義

  • ':單引號,視內容為字面量。
  • ":雙引號,保留部分特殊符號功能。
  • `:舊式命令替換。
  • \:取消特殊字符的意義。
  • #:注釋符。

7. 其他符號

  • &:後台執行命令。
  • ::空操作,永遠返回成功。
  • -:選項標記。
  • !:歷史命令(如 !! 執行上一命令)。
  • %:作業控制的作業 ID。
  • =:賦值符號。

基礎範例

設定系統可執行文件搜尋路徑

export PATH="$PATH:/User/name/hugo"
  1. PATH="...": 使用錢字號取出PATH的值之後,再接上要新增的路徑
  2. export: 把PATH變數設定成環境變數

類似的使用還有在字串中執行指令,使用 echo "The current path is $(pwd)"可以呼叫 pwd

尋找並且刪除

find . -type d -name "__pycache__" -exec rm -r {} +
  1. 找到所有符合的資料夾並且印出,find . 從目前資料夾開始尋找,-type d 只找資料夾,-name "__pycache__" 指定名稱
  2. -exec rm -r {} + 對每一個符合條件的資料夾執行 rm -r 指令
  3. {} 代表每個找到的資料夾,是一個佔位符
  4. + 表示一次執行多個 rm -r
  5. 也可以把 + 改成 \;,每搜尋到一個就會刪除一次,反斜線用於逃脫特殊字符

清除所有 pip 套件

pip freeze > unins && pip uninstall -y -r unins && rm unins

這就簡單了,所有套件寫入 unins 檔案,運行移除指令最後刪除 unins

Here Document 寫入多行文字到文件中

cat > output.txt << EOF
Write
multiple
col
EOF

把 cat 的文字轉向到文件,設定遇到 EOF 結束,EOF 可以換成其他文字。

Here String 將字串傳遞給命令作為輸入

cat <<< "Hello, ${USER}"

Parameter Expansion

https://myapollo.com.tw/blog/bash-parameter-expansion/