Linux命令 declare - 聲明變量,設置或顯示變量的值和屬性。

2021-11-08 14:50 更新

declare

聲明變量,設置或顯示變量的值和屬性。

語法

declare [-aAfFgilnrtux] [-p] [name[=value] ...]

主要用途

  • 顯示包含指定屬性的全部變量和值
  • 顯示包含指定屬性的一到多個變量和值
  • 顯示一到多個變量的屬性和值
  • 顯示所有變量的屬性和值并顯示函數(shù)的定義
  • 顯示所有變量的屬性和值
  • 顯示所有全局變量的屬性和值
  • 顯示全部函數(shù)名和函數(shù)定義
  • 只顯示全部函數(shù)名
  • 顯示一到多個函數(shù)名和函數(shù)定義
  • 只顯示一到多個函數(shù)名
  • 聲明全局變量(可選:賦值)
  • 聲明變量(可選:賦值、屬性)
  • 增加、刪除變量的屬性(可選:賦值)

選項

-f 將操作或顯示限制為函數(shù)名及函數(shù)定義。
-F 只顯示函數(shù)名(調(diào)試時附加行號和源文件)。
-g 在shell函數(shù)中使用時創(chuàng)建全局變量;其他情況下忽略。
-p 顯示每個名稱的屬性和值。

*設置屬性的選項:
-a 創(chuàng)建數(shù)組(如果支持)。
-A 創(chuàng)建關(guān)聯(lián)數(shù)組(如果支持)。
-i 增加整型屬性。
+i 刪除整型屬性。
-l 增加小寫屬性,變量的值將轉(zhuǎn)換為小寫。
+l 刪除小寫屬性。
-n 增加引用屬性(如果該選項存在)。
+n 刪除引用屬性(如果該選項存在)。
-r 增加只讀屬性。
-t 增加追蹤屬性。
+t 刪除追蹤屬性。
-u 增加大寫屬性,變量的值將轉(zhuǎn)換為大寫。
+u 刪除大寫屬性。
-x 增加導出屬性。
+x 刪除導出屬性。

參數(shù)

name(可選):變量名或函數(shù)名。
value(可選):變量的值。

返回值

declare 返回true除非你提供了非法選項或賦值錯誤。具體導致異常的情況請查看討論章節(jié)的關(guān)于異常情況。

例子

# 聲明變量,當然也歡迎您在這個網(wǎng)站(感謝本項目發(fā)起人 @jaywcjlove)查詢linux命令。
declare reference_website='https://wangchujiang.com/linux-command/'

# 顯示所有包含整型屬性的變量和值。
declare -i
# 定義變量b并賦值為3,具有整型屬性。
declare -i b=5
# 顯示屬性,返回 declare -i b="5"。
declare -p b
# 刪除整型屬性。
declare +i b
# 顯示屬性,返回 declare -- b="5"。
declare -p b
# 根據(jù)變量屬性強制轉(zhuǎn)換值的英文大小寫。
declare -u uc_var='abc'
declare -l lc_var='ABC'
# 顯示'ABC abc';
echo "${uc_var} ${lc_var}"
# 定義函數(shù)內(nèi)的全局變量
function test(){
  declare -g a=3
  # 或者
  local -g b=3
  # 或者
  c=3
  # 讓我們查看它們的屬性。
  declare -p a b c
}
# 執(zhí)行函數(shù)。
test
# 返回結(jié)果。
# declare -- a="3"
# declare -- b="3"
# declare -- c="3"

# 定義函數(shù)外的全局變量
declare a=3
b=3
declare –p a b
# 返回結(jié)果如下。
# declare -- a="3"
# declare -- b="3"

# 定義局部變量
function test2(){
  local -i a=3
  declare -i b=3
}
test2
# 沒有該變量(已經(jīng)被銷毀了)
echo "${a} $"
# 因此,我們?nèi)粘D_本中最常見的類似于'a=3'實際上是聲明并賦值了一個全局變量。
# 在接下來的 **討論** 環(huán)節(jié)會延伸討論全局和局部變量問題。
# 注意,不能使用 `+a` 或 `+A` 取消數(shù)組,也不能使用 `+r` 取消只讀屬性。

# 定義只讀數(shù)組,設置屬性的同時定義賦值。
declare -ar season=('Spring' 'Summer' 'Autumn' 'Winter')
# 或者這樣。
season=('Spring' 'Summer' 'Autumn' 'Winter')
declare -ar season
# 顯示所有數(shù)組。
declare -a
# 定義關(guān)聯(lián)數(shù)組。

declare -A fruits=(['apple']='red' ['banana']='yellow')
# 顯示所有關(guān)聯(lián)數(shù)組。
declare -A
# 顯示所有變量的屬性和值并顯示函數(shù)的定義,輸出很長。
declare
# 顯示所有變量的屬性和值。
declare -p
# 顯示所有全局變量的屬性和值。
declare -g
# 顯示全部函數(shù)名和函數(shù)定義。
declare -f
# 只顯示全部函數(shù)名。
declare -F

# 定義兩個函數(shù)。
function func_a(){ echo $(date +"%F %T"); }
function func_b(){ cd /; ls -lh --sort=time; }
# 顯示一到多個函數(shù)名和函數(shù)定義。
declare -f func_a func_b
# 只顯示一到多個函數(shù)名,驗證某個名稱是否已經(jīng)定義為函數(shù)時有用。
declare -F func_a func_b
# 最好不要讓函數(shù)名和變量名相同。

討論

  1. 全局和局部變量正如上面例子指出的情況,我們在日常編寫程序的時候需要了解這些概念,在這里 做個簡要地介紹,當然你也可以很方便的搜索到相關(guān)內(nèi)容。全局變量:在整個腳本執(zhí)行期間,只要沒有被刪除就一直存在。局部變量:在函數(shù)內(nèi)定義,函數(shù)執(zhí)行后就被刪除。建議函數(shù)內(nèi)使用local命令,函數(shù)外使用declare命令。不要在腳本中定義過多的全局變量,那樣可能會被其他函數(shù)調(diào)用造成意料之外的后果,并且也不方便檢查出來。更不用說缺乏必要的注釋了 —— ZhuangZhu-74相關(guān)資料:google提供的編碼規(guī)范全局變量的討論
  2. 關(guān)于declare typeset export local readonly命令為什么declare能做到的事,還需要定義其他這些命令呢?因為這樣語句含義會更加明確,例如:設置導出屬性的變量時,export var和declare -x var。在函數(shù)內(nèi)聲明變量時,使用local。聲明只讀變量,使用readonly。typeset和declare命令一樣。
  3. 關(guān)于異常情況有多種原因?qū)е耫eclare失敗,關(guān)于這些情況可以參考bash在線文檔declare部分(最新版),或執(zhí)行 info bash 查看declare部分最后一大串a(chǎn)n attempt is開頭的句子。

注意

  1. 該命令是bash內(nèi)建命令,相關(guān)的幫助信息請查看help命令。
  2. 導出屬性的相關(guān)介紹請查看'export'命令。
  3. 只讀屬性的相關(guān)介紹請查看'readonly'命令。
  4. 引用屬性的相關(guān)介紹請查看'unset'命令的例子部分。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號