變數與字串
Bash shell沒有所謂的“資料形態”,除非使用內建declare特別指定變數的型態。在Bash shell中,只有一種資料型態:以字元組成的字串
不必經過事先聲明的程式想用就用
設定變數值之後,該變數值只在當前的shell環境中有效。變數名長度無限制,區分大小寫。
設定變數的方法:變數名稱=值 但好的習慣是把字串用雙引號或單引號括起來。等號的兩邊不能有空白,右側有空白時要用引號括起來。
為避免出錯,可規定變數一律要先經過設定的程式才能使用。方法:shopt -s -o nounset
取得變數值:$變數名稱或${變數名稱},如變數的後面接有其他英、數單詞或底線,須用{}隔開$和變數名稱,如${myname}Mmm 否則,不必
echo printf 顯示變數值
取消變數:
unset 變數名 先找變數再找函數
unset -v 變數名 取消變數
unset -f 函數名 取消函數
清空變數:變數名= 其值為null(空),但變數還存在
雙引號括起變數可進行:替換變數;替換命令執行結果;替換算術運算結果
單引號的作用是形成一個所見即所得 (WYSIWYG)的字串(寫什麼就顯示什麼),不會進行任何替換變數的操作
變數的執行範圍,僅在各自的shell環境中有效
使變數成為環境變數,就能為子shell取用 export declare -x 變數=""
取消環境變數:testVar= 或 unset testVar
各種Bash內建變數
唯讀變數:readonly 變數名 readonly -f 函數名 readonly -a 數組名 declare -r 變數名 declare調整變數屬性的方法
別名:alias 別名=指令 不能有空白,右側有時單引號括起來,可遞迴定義
取消別名:unalias 別名
數組:下標從0開始,顯示或擷取某元素值:${數組名[索引值]}
也可以指定個別元素的索引,如:c={[3]=10,[1]=20,[10]=30}
取出數組所有元素:${B[@]} 以空白隔開的 或${B[*]} 一整個字串
取得數組元素個數:${#數組[@]}或${#數組[*]}
若數組元素是字串,${#數組[索引]}獲得某元素長度
取消數組或數組元素:unset A unset A[i]
利用Here Document,打包C等的原始碼。一個攜帶攻擊程式的原型。
進階變數
變數擴充是一種簡易的條件判斷,對不同的條件賦予變數不同的替換值,即:變數擴充是對基本型加上條件判斷,如若條件符合(如不存在或空值),則進行變數替換,若不符合,也有相應做法,它其實是一種隱含的"if-then-else"的程式文法
“變數存在”的定義:如果變數曾設值過,則稱變數存在,反之不曾設值過,或曾用unset取消變數,則稱變數不存在或未定義
測試變數“存在與否”:${待測變數-預設值}
測試變數“不存在”或其值為空白:
“傳回”一個預設值 ${待測變數:-預設值} 主要用途:在script中這個變數一定要有值才行,因此變數擴充的結果一定要傳回一個非空值(使用預設值或變數值)
[-n #{DEBUG:-}] && set -v
給變數設一個預設值
提示錯誤資訊:${待測變數:?提示資訊} 顯示變數名稱和提示資訊,並立即停止執行script
條件式的用途:確保某變數值一定要存在,否則若是繼續執行,恐怕會發生嚴重後果
測試變數的“存在性":${待測變數:+真值} 用來測試某件事是真的
整理小結:
取字串切片、長度:${變數:位置起點},${變數:位置起點:長度}
取部分位置參數 ${@:起點},${@:起點:個數}
計算長度:${#變數名}
對比樣式:
由前面相比,刪除最短的${變數#樣式};刪除最長的${變數##樣式}
由後面相比,刪除最短的${變數%樣式};刪除最長的${變數%%樣式}
取代或刪除部分字串,只替換第一個對比符合的字串${變數/樣式/替換字串},全部符合的${變數//樣式/替換字串};只刪除第一個對比符合的字串${變數/樣式/},全部符合的${變數//樣式/}
整理小結:
擷取變數名稱列表、數組索引列表:
${!陣列變數[@]}或${!陣列變數[*]}
${!開頭字串@]}或${!開頭字串*]}
命令替換:變數名=$(命令)或變數名=`命令`,提倡前者
算術擴充:$((算術式)),才會運算,不然就一字串