declare 與 typeset 命令是bash的內建命令,兩者是完全一樣的,用來聲明shell變量,設置變量的屬性。
declare命令(別名typeset)屬shell內建命令,用於申明shell變量並設置變量屬性,或查看已定義的shell變量和函數。若不加上任何參數,則會顯示全部的shell變量與函數(與執行set指令的效果相同)。
常用命令參數
-
-r 設置變量為只讀
-
-i 設置變量為整數
-
-a 設置變量為數組array
-
-f 如果后面沒有參數的話會列出之前腳本定義的所有函數,如果有參數的話列出以參數命名的函數
-
-x 設置變量在腳本外也可以訪問到
-a:申明數組變量 -A:申明關聯數組,可以使用字符串作為數組索引 -f:僅顯示已定義的函數 -F:不顯示函數定義 -i:聲明整型變量 -l:將變量值的小寫字母變為小寫 -u:變量值的大寫字母變為大寫 -r:設置只讀屬性 -t:設置變量跟蹤屬性,用於跟蹤函數進行調試,對於變量沒有特殊意義 -x:將指定的shell變量換成環境變量 -p:顯示變量定義的方式和值 +:取消變量屬性,但是+a和+r無效,無法刪除數組和只讀屬性,可以使用unset刪除數組,但是unset不能刪除只讀變量
(1)定義關聯數組並訪問。
declare -A assArray=([lucy]=beijing [yoona]=shanghai) #讀取關聯數組全部內容 echo ${assArray[*]} #或 echo ${assArray[@]} #輸出 beijing shanghai #讀取指定索引的數組值 echo ${assArray[lucy]} #輸出: beijing #列出數組索引列表 echo ${!assArray[*]} #或 echo ${!assArray[@]} #輸出 yoona lucy
(2)定義只讀變量
declare -r name1="lvlv1" #或 typeset -r name2="lvlv2" #或 readonly name3="lvlv3"
Shell規定,只讀變量生命周期與當前Shell腳本進程相同,且不能消除只讀屬性和刪除只讀變量,除非kill當前Shell腳本進程。
(3)使用-p
選項顯示變量name1和name2的定義方式和當前值。
declare -p name1 name2 name3 #輸出 declare -r name1="lvlv1" declare -r name2="lvlv2" declare -r name3="lvlv3"
(4)使用-x
選項將shell變量轉換為臨時環境變量,供當前Shell會話的其他shell進程使用,退出當前Shell會話則失效。
declare -x name1;
(5)顯示所有shell環境變量。
declare -x
(6)使用+x
選項取消變量為環境變量。
delcare +x name1
(7)申明整型變量,賦值浮點型數值將報錯。
declare -i integer=666
格式:declare -p var
格式:typeset -p var
顯示指定變量var的值。
格式:declare var=value
格式:typeset var=value
格式:var=value
聲明變量並賦值。
格式:declare -i var
格式:typeset -i var
將變量var定義成整數。在之后就可以直接對表達式求值,結果只能是整數。如果求值失敗或者不是整數,就設置為0。
格式:declare -r var
格式:typeset -r var
格式:readonly var
將變量var聲明為只讀變量。只讀變量不允許修改,也不允許刪除。
格式:declare -a var
格式:typeset -a var
將變量var聲明為數組變量。但這沒有必要。所有變量都不必顯式定義就可以用作數組。事實上,在某種意義上,似乎所有變量都是數組,而且賦值給沒有下標的變量與賦值給"[0]"相同。
格式:declare -f
格式:typeset -f
顯示所有自定義函數,包括名稱和函數體。
格式:declare -F
格式:typeset -F
顯示所有自定義函數名稱。
格式:declare -f func
格式:typeset -f func
只顯示指定函數func的函數定義。
格式:declare -x var
格式:typeset -x var
格式:export var
將變量var設置成環境變量,這樣在隨后的腳本和程序中可以使用。
格式:declare -x var=value
格式:typeset -x var=value
格式:export var=value
將變量var設置成環境變量,並賦值為value。
Linux下Bash的變量使用,echo,read,declare,typeset,array,local
變量設定規則
1、變量與變量內容用一個等號來連接
myname=del1214
2、等號兩邊不能直接接空格,下面的賦值是錯誤的
myname = del1214 或 myname= del 1214
3、變量名只能是英文字母與數字,但第一個字符不能使數字,下面是錯誤的
1myname=del1214
4、變量內容有空格符可以用雙引號"或單引號'使內容連接起來,但
雙引號內的特殊字符$,可以保留原有的特性,如下:
var="lang is $LANG" 則echo $var 顯示 lang is en_US
單引號內的特殊字符則為一般字符,如下:
var='lang is $LANG' 則echo $var 顯示 lang is $LANG
5、使用轉義字符將特殊符號(回車,$,\,空格,'等)變成一般字符
6、在變量中使用命令,需要用`命令`或$(命令),例如取得內核版本號
version=$(uname -r)
echo $version
2.6.xxxxxxxxx
7、變量內容相加(字符串相加),使用"$變量名"或${變量},例如:
PATH="$PATH":/home/bin
8、將變量轉為環境變量,使用export命令
export PATH
9、環境變量一般為全大寫字母,自定義變量使用小寫字母
10、取消變量命令unset,unset 變量名
變量由鍵盤輸入read
要讀取來自鍵盤輸入的變量,使用read指令
read [-pt] 變量名
-p: 后面接提示字符
-t: 后面接等待的秒數
例如:
read -p "please type your name" -t 10 yourname
變量類型的定義declare/typeset
declare
declare [-aixr] 變量名
-a: 將后面的變量名定義為數組array類型
-i: 將后面的變量名定義為整數數字integer類型
-x: 將后面的變量名定義為環境變量,功能同export
+x: 取消環境變量
-r: 將變量名定義為readonly類ing,不能更改不能unset
只讀屬性一旦確定,只能通過注銷再登陸來恢復該變量的類型
bash對變量類型的基本定義
變量類型默認為字符串,不明確指定類型就是字符串,1+2是字符串不會自動算成3
bash中的數值運算只能是整數,1/3結果是0
typeset
typeset [-aAfFgilrtux] [-p] name[=value]
說明不是很全,還是用declare吧
變量中數組array的使用
設定方法:
var[index]=content
例如:
var[1]="aaa"
var[2]="bbb"
var[3]="ccc"
echo "${var[1]},${var[2]},${var[3]}"
aaa,bbb,ccc
變量內容的刪除與替換
變量設定方式 |
說明 |
---|---|
${變量#關鍵詞} ${變量##關鍵詞} |
若變量內容從【頭】開始的數據符合關鍵詞,則將符合的最【短】數據刪除 若變量內容從【頭】開始的數據符合關鍵詞,則將符合的最【長】數據刪除 |
${變量%關鍵詞} ${變量%%關鍵詞} |
若變量內容【從后向前】的數據符合關鍵詞,則將符合的最【短】數據刪除 若變量內容【從后向前】的數據符合關鍵詞,則將符合的最【長】數據刪除 |
${變量/舊字符串/新字符串} ${變量//舊字符串/新字符串} |
若變量內容符合舊字符串則【第一個】舊字符串會被新字符串取代 若變量內容符合舊字符串則【全部的】舊字符串會被新字符串取代 |
變量內容的判斷與替換
變量設定方式 | str沒有設定null | str為空字符串"" | str已設定為非空字符串 |
---|---|---|---|
var=${str-expr} var=${str:-expr} |
var=expr var=expr |
var= var=expr |
var=$str var=$str |
var=${str+expr} | var= | var=expr | var=expr |
var=${str:+expr} | var= | var= | var=expr |
var=${str=expr} var=${str:=expr} |
str=expr var=expr str=expr var=expr |
str不變 var= str=expr var=expr |
str不變 var=$str str不變 var=$str |
var=${str?expr} | expr輸出至stderr | var= | var=$str |
var=${str:?expr} | expr輸出至stderr | expr輸出至stderr | var=$str |
我個人的理解是
-:變量中不包含后面字符串時
+:變量中包含后面字符串時
=:變量等於后面字符串時
?:輸出
:冒號:變量為空字符串時取不加冒號時相反的動作