變量引用
- $(VAR): 會將VAR當做一條命令來執行
- ‘$VAR’: 單引號中包含的變量, 不會被引用, 仍然輸出$VAR
- “$VAR”: 雙引號中包含的變量, 會被引用成$VAR的值輸出
- “: 優先執行其中的命令, 用在字符串中時, 僅在”“當中有效
有時需要在一個字符串變量中定義一個命令並預先包含一個變量名, 在使用時再轉換成變量名, 此時可通過eval命令來達到目的.
CMD='eval echo $VALUE'
VALUE="Hello"
$CMD
# 執行echo "Hello", 輸出"Hello"
特殊變量
- $0: 獲取當前執行腳本的文件名,包括路徑
- $n: 獲取當前執行的shell腳本的第N個參數, n=1..9, 當n爲0時表示腳本的文件名, 如果n大於9, 可用大括號括起來如${10}
- $@: 這個程序的所有參數”
1"" 2” “$3”…, 這是將參數傳遞給其他程序的最佳方式, 因爲會保留所有內嵌在每個參數裏的空白 - $*: 獲取當前shell的所有參數,會將所有的命令行參數視爲單個字符串
- $?: 代表上一個命令執行是否成功的標誌,如果執行成功則$? 爲0, 否則不爲0
- $#: 獲取當前shell命令行中參數的總個數
- $_: 代表上一個命令的最後一個參數
- $$: 代表所在命令的PID
- $!: 代表最後執行的後臺命令的PID
日誌輸出
shell腳本開發中, 輸出的語句儘量不出現在標準輸出, 除非是少數的步驟提示性語句, 如果是出錯信息, 應存入到自己定義的出錯日誌中, 以便後期維護和調試, 其它不關心的信息直接輸出到/dev/null中. 否則輸出信息過多, 容易耗盡緩存, 造成腳本運行卡死, 難以調試定位.
- date: 顯示日期時間的命令, 可通過此命令來作爲日誌的前綴, 方便定位. 一般形式爲 “[ date +%Y%m%d-%H%M%S` ]”
- &[n]: 代表已經存在的文件描述符, &1代表輸出, &2代表錯誤輸出, &-代表關閉與它綁定的描述符, 如2>&1 錯誤輸出綁定到標準輸出, 2>&- 等價於2>/dev/null
條件判斷
使用[ ]判斷
注意事項
[ $HOME == $MALL ]
- [ ]中每個組件都需要空格鍵來分格, 其中的變量最好都以雙引號括起來, 常量最好都以單或雙括起來
- [ ]中\==和’=’結果都完全一樣, 習慣上可儘量使用==
常用參數
數值比較
- -ne: 比較兩個參數是否不相等
- -lt 參數1是否小於參數2
- -le 參數1是否小於等於參數2
- -gt 參數1是否大於參數2
- -ge 參數1是否大於等於參數2
- -n:判斷變量是否有值
文件比較
- -f 檢查某文件是否存在
- -d 檢查目錄是否存在
- -x:判斷是否存在並有可執行權限
- -d: 文件爲目錄爲真
- -c: 文件爲字符特殊文件爲真
- -b: 文件爲塊特殊文件爲真
- -s: 文件大小非0時爲真
- -t: 當文件描述符(默認爲1)指定的設備爲終端時爲真
權限比較
- -r: 用戶可讀爲真
- -w: 用戶可寫爲真
- -x: 用戶可執行爲真