declare
聲明變量,設置或顯示變量的值和屬性。
語法
1declare [-aAfFgilnrtux] [-p] [name[=value] ...]
主要用途
- 顯示包含指定屬性的全部變量和值
- 顯示包含指定屬性的一到多個變量和值
- 顯示一到多個變量的屬性和值
- 顯示所有變量的屬性和值並顯示函數的定義
- 顯示所有變量的屬性和值
- 顯示所有全局變量的屬性和值
- 顯示全部函數名和函數定義
- 只顯示全部函數名
- 顯示一到多個函數名和函數定義
- 只顯示一到多個函數名
- 聲明全局變量(可選:賦值)
- 聲明變量(可選:賦值、屬性)
- 增加、刪除變量的屬性(可選:賦值)
選項
1-f 將操作或顯示限制爲函數名及函數定義。
2-F 只顯示函數名(調試時附加行號和源文件)。
3-g 在shell函數中使用時創建全局變量;其他情況下忽略。
4-p 顯示每個名稱的屬性和值。
5
6*設置屬性的選項:
7-a 創建數組(如果支持)。
8-A 創建關聯數組(如果支持)。
9-i 增加整型屬性。
10+i 刪除整型屬性。
11-l 增加小寫屬性,變量的值將轉換爲小寫。
12+l 刪除小寫屬性。
13-n 增加引用屬性(如果該選項存在)。
14+n 刪除引用屬性(如果該選項存在)。
15-r 增加只讀屬性。
16-t 增加追蹤屬性。
17+t 刪除追蹤屬性。
18-u 增加大寫屬性,變量的值將轉換爲大寫。
19+u 刪除大寫屬性。
20-x 增加導出屬性。
21+x 刪除導出屬性。
參數
1name(可選):變量名或函數名。
2value(可選):變量的值。
返回值
declare 返回true除非你提供了非法選項或賦值錯誤。具體導致異常的情況請查看討論章節的關於異常情況。
例子
1# 聲明變量,當然也歡迎您在這個網站(感謝本項目發起人 @jaywcjlove)查詢linux命令。
2declare reference_website='https://wangchujiang.com/linux-command/'
3
4# 顯示所有包含整型屬性的變量和值。
5declare -i
6# 定義變量b並賦值爲3,具有整型屬性。
7declare -i b=5
8# 顯示屬性,返回 declare -i b="5"。
9declare -p b
10# 刪除整型屬性。
11declare +i b
12# 顯示屬性,返回 declare -- b="5"。
13declare -p b
14# 根據變量屬性強制轉換值的英文大小寫。
15declare -u uc_var='abc'
16declare -l lc_var='ABC'
17# 顯示'ABC abc';
18echo "${uc_var} ${lc_var}"
1# 定義函數內的全局變量
2function test(){
3 declare -g a=3
4 # 或者
5 local -g b=3
6 # 或者
7 c=3
8 # 讓我們查看它們的屬性。
9 declare -p a b c
10}
11# 執行函數。
12test
13# 返回結果。
14# declare -- a="3"
15# declare -- b="3"
16# declare -- c="3"
17
18# 定義函數外的全局變量
19declare a=3
20b=3
21declare –p a b
22# 返回結果如下。
23# declare -- a="3"
24# declare -- b="3"
25
26# 定義局部變量
27function test2(){
28 local -i a=3
29 declare -i b=3
30}
31test2
32# 沒有該變量(已經被銷燬了)
33echo "${a} ${b}"
34# 因此,我們日常腳本中最常見的類似於'a=3'實際上是聲明並賦值了一個全局變量。
35# 在接下來的 **討論** 環節會延伸討論全局和局部變量問題。
1# 注意,不能使用 `+a` 或 `+A` 取消數組,也不能使用 `+r` 取消只讀屬性。
2
3# 定義只讀數組,設置屬性的同時定義賦值。
4declare -ar season=('Spring' 'Summer' 'Autumn' 'Winter')
5# 或者這樣。
6season=('Spring' 'Summer' 'Autumn' 'Winter')
7declare -ar season
8# 顯示所有數組。
9declare -a
10# 定義關聯數組。
11
12declare -A fruits=(['apple']='red' ['banana']='yellow')
13# 顯示所有關聯數組。
14declare -A
1# 顯示所有變量的屬性和值並顯示函數的定義,輸出很長。
2declare
3# 顯示所有變量的屬性和值。
4declare -p
5# 顯示所有全局變量的屬性和值。
6declare -g
1# 顯示全部函數名和函數定義。
2declare -f
3# 只顯示全部函數名。
4declare -F
5
6# 定義兩個函數。
7function func_a(){ echo $(date +"%F %T"); }
8function func_b(){ cd /; ls -lh --sort=time; }
9# 顯示一到多個函數名和函數定義。
10declare -f func_a func_b
11# 只顯示一到多個函數名,驗證某個名稱是否已經定義爲函數時有用。
12declare -F func_a func_b
13# 最好不要讓函數名和變量名相同。
討論
-
全局和局部變量
正如上面例子指出的情況,我們在日常編寫程序的時候需要了解這些概念,在這裏 做個簡要地介紹,當然你也可以很方便的搜索到相關內容。
- 全局變量:在整個腳本執行期間,只要沒有被刪除就一直存在。
- 局部變量:在函數內定義,函數執行後就被刪除。
建議函數內使用
local
命令,函數外使用declare
命令。不要在腳本中定義過多的全局變量,那樣可能會被其他函數調用造成意料之外的後果,並且也不方便檢查出來。
更不用說缺乏必要的註釋了 —— ZhuangZhu-74
相關資料:
-
關於
declare
typeset
export
local
readonly
命令爲什麼
declare
能做到的事,還需要定義其他這些命令呢?因爲這樣語句含義會更加明確,例如:
- 設置導出屬性的變量時,
export var
和declare -x var
。 - 在函數內聲明變量時,使用
local
。 - 聲明只讀變量,使用
readonly
。
typeset
和declare
命令一樣。 - 設置導出屬性的變量時,
-
關於異常情況
有多種原因導致
declare
失敗,關於這些情況可以參考bash在線文檔declare部分(最新版),或執行info bash
查看declare
部分最後一大串an attempt is
開頭的句子。
注意
- 該命令是bash內建命令,相關的幫助信息請查看
help
命令。 - 導出屬性的相關介紹請查看'export'命令。
- 只讀屬性的相關介紹請查看'readonly'命令。
- 引用屬性的相關介紹請查看'unset'命令的例子部分。
來源:https://github.com/jaywcjlove/linux-command
最後修改於: Wednesday, January 31, 2024
版權申明:
- 未標註來源的內容皆為原創,未經授權請勿轉載(因轉載後排版往往錯亂、內容不可控、無法持續更新等);
- 非營利為目的,演繹本博客任何內容,請以'原文出處'或者'參考鏈接'等方式給出本站相關網頁地址(方便讀者)。