標籤:
建立指令碼:vim test.sh
指令碼內容:#! /bin/bash #"#!"是一個約定標記,告訴系統用哪種shell來執行
echo "Hello world!"
使指令碼具有執行許可權:chmod +x ./test.sh
執行指令碼:./test.sh #注意,一定要寫成./test.sh,而不是test.sh。若直接寫成test.sh,linux會去PATH裡面找尋有沒有test.sh.
[shell注釋]:以“#”開頭的行為注釋,shell沒有多行注釋
[輸入輸出命令]
echo命令:echo $variablename #從stdout輸出變數值variablename
echo -e "\n" #-e選項是用來啟用逸出字元,此處啟用分行符號\n
printf命令:printf format-string [arguments...]
format-string:s% d%
arguments使用空格分割,不用逗號
printf不會像echo那樣自動換行,必須顯示添加分行符號(\n)
參數多于格式控制符(%)時,format-string可以重用,可以將所有參數都轉
read命令:read name #從stdin擷取輸入並賦值給變數name
[shell變數]
定義:variablename="value" #變數名和等號之間不能有空格
使用:$variablename #使用一個定義過的變數,只要在變數名前面加$符號
重新定義:variablename="newvalue" #直接覆蓋就行
唯讀變數:variablename="value"
readonly variablename #用readonly命令可將變數定義為唯讀變數,不可修改
刪除變數:unset variablename #unset命令不能刪除唯讀變數
變數類型:局部變數,環境變數,shell變數
[Shell特殊變數]
$0 當前指令碼的檔案名稱
$n 傳遞給指令碼或函數的參數。n是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$# 傳遞給指令碼或函數的參數個數。
$* 傳遞給指令碼或函數的所有參數。
[email protected] 傳遞給指令碼或函數的所有參數。被雙引號(" ")包含時,與 $*稍有不同,下面將會講到。
$? 上個命令的退出狀態,或函數的傳回值,0表示成功,其他值表示失敗。
$$ 當前Shell進程ID。對於 Shell指令碼,就是這些指令碼所在的進程ID。
[命令替換]`command` #``是反引號,位於ESC建下方,不是單引號
[變數替換]
${var}:變數本來的值
${var:-word}:如果變數 var 為空白或已被刪除(unset),那麼返回word,但不改變 var 的值。
${var:=word}:如果變數 var 為空白或已被刪除(unset),那麼返回word,並將 var 的值設定為 word。
${var:?message}:如果變數 var為空白或已被刪除(unset),那麼將訊息 message送到標準錯誤輸出,可以用來檢測變數 var 是否可以被正常賦值。若此替換出現在Shell指令碼中,那麼指令碼將停止運行。
${var:+word}:如果變數 var 被定義,那麼返回 word,但不改變var的值。
[Shell運算子]
原生bash不支援簡單的數學運算,但是可以通過其他命令來實現,例如
awk 和 expr,expr 最常用。如:val=`expr 2 + 2`
注意:
1.運算式和運算子之間要有空格,例如 2+2是不對的,必須寫成2 + 2。
2.完整的運算式要被` `包含,這個字元不是單引號,在Esc鍵下邊。
[算術運算]:+,-,×,/,%,=,==,!=
注意:
1.乘號(*)前邊必須加反斜線(\)才能實現乘法運算;
2.條件運算式要放在方括弧之間,並且要有空格,例如if[$a==$b]
是錯誤的,必須寫成 if [ $a == $b ]。
[關係運算]:-eq,-ne,-gt,-lt,-ge,-le
關係運算子只支援數字,不支援字串,除非字串的值是數字。
[布爾運算]:非!,或-o,與-a
[字串運算]:=,!=,-z(長度為0為true),-n(長度不為0為true),str(非空為true)
[檔案測試運算]
[Shell字串]
字串可以用單引號,雙引號,也可以不用引號。
單引號:
單引號裡的任何字元都會原樣輸出,單引號字串中的變數是無效的;
單引號字串中不能出現單引號(對單引號使用轉義符後也不行)。
雙引號:
雙引號裡可以有變數,可以出現逸出字元
擷取字串長度:${#string}
提取子字串:${string:1:4} #輸出下標為1到4的字串,包括1和4,字元下標從0開始
尋找子字串下標:echo `expr index "$string" sub_string`
[Shell數組]
bash支援一維數組(不支援多維陣列),並且沒有限定數組的大小。數組元素的下標由0開始編號,擷取數組中的元素要利用下標,下標可以是整數或算術運算式,其值應大於等於0.
定義數組:
在Shell中,用括弧來表示數組,數組元素用“空格”符號分割開。定義數組的一般形式為: array_name=(value1 ... valuen)
讀取數組元素: ${array_name[index]}
使用@或×來讀取數組所有元素: ${array_name[*]} 或 ${array_name[@]}
擷取數組的長度:
# 取得數組元素的個數
length=${#array_name[@]} 或 length=${#array_name[*]}
# 取得數組單個元素的長度
lengthn=${#array_name[n]}
Shell編程——bash基礎知識