<span id="vexk9"><table id="vexk9"></table></span>

      declare

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

      語法

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

      主要用途

      選項

      -f 將操作或顯示限制為函數名及函數定義。
      -F 只顯示函數名(調試時附加行號和源文件)。
      -g 在shell函數中使用時創建全局變量;其他情況下忽略。
      -p 顯示每個名稱的屬性和值。
      
      *設置屬性的選項:
      -a 創建數組(如果支持)。
      -A 創建關聯數組(如果支持)。
      -i 增加整型屬性。
      +i 刪除整型屬性。
      -l 增加小寫屬性,變量的值將轉換為小寫。
      +l 刪除小寫屬性。
      -n 增加引用屬性(如果該選項存在)。
      +n 刪除引用屬性(如果該選項存在)。
      -r 增加只讀屬性。
      -t 增加追蹤屬性。
      +t 刪除追蹤屬性。
      -u 增加大寫屬性,變量的值將轉換為大寫。
      +u 刪除大寫屬性。
      -x 增加導出屬性。
      +x 刪除導出屬性。
      

      參數

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

      返回值

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

      例子

      # 聲明變量,當然也歡迎您在這個網站(感謝本項目發起人 @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
      # 根據變量屬性強制轉換值的英文大小寫。
      declare -u uc_var='abc'
      declare -l lc_var='ABC'
      # 顯示'ABC abc';
      echo "${uc_var} ${lc_var}"
      
      # 定義函數內的全局變量
      function test(){
        declare -g a=3
        # 或者
        local -g b=3
        # 或者
        c=3
        # 讓我們查看它們的屬性。
        declare -p a b c
      }
      # 執行函數。
      test
      # 返回結果。
      # declare -- a="3"
      # declare -- b="3"
      # declare -- c="3"
      
      # 定義函數外的全局變量
      declare a=3
      b=3
      declare –p a b
      # 返回結果如下。
      # declare -- a="3"
      # declare -- b="3"
      
      # 定義局部變量
      function test2(){
        local -i a=3
        declare -i b=3
      }
      test2
      # 沒有該變量(已經被銷毀了)
      echo "${a} ${b}"
      # 因此,我們日常腳本中最常見的類似于'a=3'實際上是聲明并賦值了一個全局變量。
      # 在接下來的 **討論** 環節會延伸討論全局和局部變量問題。
      
      # 注意,不能使用 `+a` 或 `+A` 取消數組,也不能使用 `+r` 取消只讀屬性。
      
      # 定義只讀數組,設置屬性的同時定義賦值。
      declare -ar season=('Spring' 'Summer' 'Autumn' 'Winter')
      # 或者這樣。
      season=('Spring' 'Summer' 'Autumn' 'Winter')
      declare -ar season
      # 顯示所有數組。
      declare -a
      # 定義關聯數組。
      
      declare -A fruits=(['apple']='red' ['banana']='yellow')
      # 顯示所有關聯數組。
      declare -A
      
      # 顯示所有變量的屬性和值并顯示函數的定義,輸出很長。
      declare
      # 顯示所有變量的屬性和值。
      declare -p
      # 顯示所有全局變量的屬性和值。
      declare -g
      
      # 顯示全部函數名和函數定義。
      declare -f
      # 只顯示全部函數名。
      declare -F
      
      # 定義兩個函數。
      function func_a(){ echo $(date +"%F %T"); }
      function func_b(){ cd /; ls -lh --sort=time; }
      # 顯示一到多個函數名和函數定義。
      declare -f func_a func_b
      # 只顯示一到多個函數名,驗證某個名稱是否已經定義為函數時有用。
      declare -F func_a func_b
      # 最好不要讓函數名和變量名相同。
      

      討論

      1. 全局和局部變量

        正如上面例子指出的情況,我們在日常編寫程序的時候需要了解這些概念,在這里 做個簡要地介紹,當然你也可以很方便的搜索到相關內容。

        • 全局變量:在整個腳本執行期間,只要沒有被刪除就一直存在
        • 局部變量:在函數內定義,函數執行后就被刪除。

        建議函數內使用local命令,函數外使用declare命令。

        不要在腳本中定義過多的全局變量,那樣可能會被其他函數調用造成意料之外的后果,并且也不方便檢查出來。

        更不用說缺乏必要的注釋了 —— ZhuangZhu-74

        相關資料:

      2. 關于declare typeset export local readonly命令

        為什么declare能做到的事,還需要定義其他這些命令呢?

        因為這樣語句含義會更加明確,例如:

        • 設置導出屬性的變量時,export vardeclare -x var
        • 在函數內聲明變量時,使用local
        • 聲明只讀變量,使用readonly

        typesetdeclare命令一樣。

      3. 關于異常情況

        有多種原因導致declare失敗,關于這些情況可以參考bash在線文檔declare部分(最新版),或執行 info bash 查看declare部分最后一大串an attempt is開頭的句子。

      注意

      1. 該命令是bash內建命令,相關的幫助信息請查看help命令。
      2. 導出屬性的相關介紹請查看'export'命令。
      3. 只讀屬性的相關介紹請查看'readonly'命令。
      4. 引用屬性的相關介紹請查看'unset'命令的例子部分。
      主站蜘蛛池模板: 综合欧美五月丁香五月| 国产精品亚洲综合天堂夜夜| 色噜噜狠狠狠狠色综合久| 色婷婷综合和线在线| 99久久综合精品五月天| 精品第一国产综合精品蜜芽| 国产亚洲综合成人91精品| 97se亚洲综合在线| 精品综合久久久久久88小说| 亚洲av成人综合网| 亚洲国产综合久久天堂| 狼狼综合久久久久综合网| 亚洲av日韩综合一区久热| 中文字幕色综合久久| 亚洲综合一区二区三区四区五区| 国产精品亚洲综合| 亚洲综合在线成人一区| 狠狠色婷婷狠狠狠亚洲综合 | 色综合天天做天天爱| 狠狠色婷婷丁香综合久久韩国 | 久久综合亚洲色HEZYO社区 | 狠狠爱天天综合色欲网| 亚洲综合亚洲国产尤物| 色婷婷综合缴情综免费观看| 六月婷婷缴清综合在线| 亚洲狠狠综合久久| 久久无码无码久久综合综合| 国产成人综合精品一区| 国产成人综合在线视频| 91在线亚洲综合在线| 中文字幕亚洲综合久久| 亚洲综合校园春色| 97久久天天综合色天天综合色hd| 伊人久久综合精品无码AV专区| 五月丁香六月综合缴清无码| 婷婷丁香五月天综合东京热| 狠狠色噜噜狠狠狠狠色吗综合| 婷婷亚洲综合五月天小说在线| 成人综合国产乱在线| 乱色熟女综合一区二区三区| 99久久综合狠狠综合久久止|