Shell 是一個命令行解釋器,它為用戶提供了一個向 Linux 內核發送請求以運行程序的介面。透過 Shell,用戶可以啟動、掛起、停止甚至編寫程序。Shell 同時也是一種功能強大的程式語言,具有易編寫、易調試、靈活性高等特點。作為解釋執行的腳本語言,Shell 可以直接調用 Linux 系統命令。
Shell 的主要語法類型分為 Bourne 和 C 兩大家族,兩者語法不兼容。
自 1979 年起 Unix 開始使用 Bourne Shell,其主文件名為 sh,是一個非常古老且功能簡單的 Shell。
C Shell 主要在 BSD 版的 Unix 系統中使用,其語法與 C 語言相似而得名。
Bash 與 sh 兼容,目前主流 Linux 發行版均採用 Bash 作為用戶的基本 Shell。
echo $SHELL # 查看當前 Shell
vim /etc/shells # 查看系統支持的 Shell 列表
alias # 查看當前所有別名
alias ll='ls -l --color=auto' # 設置臨時別名
alias vi='vim' # 例如:輸入 vi 實際執行 vim
unalias vi
vi ~/.bashrc
# 在文件中添加
alias vi='vim'
# 保存退出後重新加載
source ~/.bashrc
$PATH 環境變量定義的目錄中查找到的第一個命令注意:別名優先級高於系統默認命令。
| 快捷鍵 | 功能 |
|---|---|
| Ctrl+C | 強制終止當前命令 |
| Ctrl+L | 清屏 |
| Ctrl+A | 光標移動到行首 |
| Ctrl+E | 光標移動到行尾 |
| Ctrl+U | 從光標處刪除到行首 |
| Ctrl+Z | 將命令放入後台 |
| Ctrl+R | 在歷史命令中搜索 |
history [選項] [歷史文件]
-c : 清空歷史命令
-w : 將緩存中的歷史命令寫入 ~/.bash_history
註: 預設保存 1000 條,可在 /etc/profile 中修改 HISTSIZE 值。
!n 重複執行第 n 條命令!! 重複執行上一條命令!字串 重複執行最後一條以該字串開頭的命令按 Tab 鍵可補全命令或文件名。若一次未補全,再按一次顯示所有匹配項。Tab 鍵在 $PATH 指定的可執行文件搜索路徑中查找命令。
| 符號 | 作用 |
|---|---|
'' | 單引號:其中所有特殊符號(如 $、`)均無特殊含義 |
"" | 雙引號:特殊符號無特殊含義,但 $、`、\ 例外,分別具備「調用變量值」「引用命令」「轉義符」功能 |
` ` | 反引號:括起的內容作為系統命令先執行,等同於 $(),推薦使用 $() |
$() | 引用系統命令,作用同反引號 |
# | Shell 腳本中以 # 開頭的行視為註釋 |
$ | 調用變量值,如 $name |
\ | 轉義符:其後的特殊符號失去特殊含義,如 \$ 輸出 $ 符號 |
$0~$9、${10} 等)# 定義:變量名=值(中間不能有空格)
x=5
# 打印
echo $x
echo ${x}
x=123
x="$x"456
x=${x}789
set # 查看所有變量(含環境變量和用戶變量)
set -u # 啟用未聲明變量報錯
unset 變量名 # 刪除變量(變量名前不加 $)
關鍵區別:用戶自定義變量僅在當前 Shell 生效,環境變量在當前 Shell 及其所有子 Shell 中生效。
# 定義變量 a
a=5
# 進入子 shell
bash
# 子 shell 中無法訪問 a
echo $a # 空輸出
# 父 shell 中導出變量
export a
bash
# 子 shell 現在可以訪問
echo $a # 輸出 5
# 子 shell 無法刪除父 shell 的變量
unset a
exit
# 父 shell 中刪除
unset a
set # 所有變量
env # 僅環境變量
| 轉義字符 | 含義 |
|---|---|
\d | 日期(如「週一 1月 01」) |
\H | 完整主機名 |
\t | 24小時制時間(HH:MM:SS) |
\A | 24小時制時間(HH:MM) |
\u | 當前用戶名 |
\w | 完整工作目錄路徑 |
\W | 當前目錄最後一級名稱 |
$ | 提示符(root 顯示 #,普通用戶顯示 $) |
echo $PS1
# 輸出示例:[\u@\h \W]\$
# 輸入不完整命令時顯示的提示符(默認為 >)
ls \
> ~
locale # 查看當前語系
echo $LANG # 查看主語系變量
locale -a | more # 查看系統支持的所有語系
系統默認語系配置文件:/etc/sysconfig/i18n
cat /etc/sysconfig/i18n
# LANG="zh_CN.UTF-8"
Linux 中文支持條件:正確安裝中文字體和語系。圖形界面可直接支持;遠程工具(如 XShell)需設置正確語系;純字符界面需第三方插件(如 zhcon)。
| 變量 | 作用 |
|---|---|
$n | $0為命令本身,$1-$9為第1-9個參數,10以上用 ${10} |
$* | 所有參數視為一個整體 |
$@ | 所有參數分別對待 |
$# | 參數個數 |
# $* 與 $@ 差異示例
for i in "$*"; do echo $i; done # 一行輸出所有參數
for i in "$@"; do echo $i; done # 每行輸出一個參數
| 變量 | 作用 |
|---|---|
$? | 上一條命令返回狀態(0 成功,非 0 失敗) |
$$ | 當前進程 PID |
$! | 後台運行的最後一個進程 PID |
| 選項 | 說明 |
|---|---|
-p "提示信息" | 等待輸入時顯示提示 |
-t 秒數 | 指定等待超時時間 |
-n 字符數 | 讀取指定字符數即執行 |
-s | 隱藏輸入(適用於密碼等機密信息) |
Shell 變量默認為字符串型,直接運算會進行字符串拼接而非數學計算。
declare [+/-][選項] 變量名
-a 數組型
-i 整數型
-x 環境變量
-r 只讀變量
-p 顯示變量聲明類型
aa=11; bb=22
cc=$aa+$bb # 結果:11+22(字符串拼接)
declare -i cc=$aa+$bb # 結果:33(數學運算)
movie[0]=zp
movie[1]=tp
declare -a movie[2]=live
echo ${movie[*]} # 輸出所有元素
export bb=2
# 等同於
declare -x bb=2
declare -rx test=123
test=456 # 報錯:readonly variable
unset test # 報錯:cannot unset
declare +r test # 報錯:readonly variable
# 方法1:expr(注意運算符兩側需有空格)
dd=$(expr $aa + $bb)
# 方法2:$(()) 或 $[](推薦,無需空格)
dd=$(($aa+$bb))
dd=$[$aa+$bb]

註:數值越大,優先級越高。

註:變量測試語法簡潔但邏輯複雜,實際工作中建議查閱手冊或採用其他等效實現方式。