declare

    主要用途

    • 显示包含指定属性的全部变量和值
    • 显示包含指定属性的一到多个变量和值
    • 显示一到多个变量的属性和值
    • 显示所有变量的属性和值并显示函数的定义
    • 显示所有变量的属性和值
    • 显示所有全局变量的属性和值
    • 显示全部函数名和函数定义
    • 只显示全部函数名
    • 显示一到多个函数名和函数定义
    • 只显示一到多个函数名
    • 声明全局变量(可选:赋值)
    • 声明变量(可选:赋值、属性)
    • 增加、删除变量的属性(可选:赋值)
    1. -F 只显示函数名(调试时附加行号和源文件)。
    2. -g shell函数中使用时创建全局变量;其他情况下忽略。
    3. -p 显示每个名称的属性和值。
    4. *设置属性的选项:
    5. -a 创建数组(如果支持)。
    6. -A 创建关联数组(如果支持)。
    7. -i 增加整型属性。
    8. +i 删除整型属性。
    9. -l 增加小写属性,变量的值将转换为小写。
    10. +l 删除小写属性。
    11. +n 删除引用属性(如果该选项存在)。
    12. -r 增加只读属性。
    13. -t 增加追踪属性。
    14. +t 删除追踪属性。
    15. -u 增加大写属性,变量的值将转换为大写。
    16. +u 删除大写属性。
    17. -x 增加导出属性。
    18. +x 删除导出属性。

    参数

    declare 返回true除非你提供了非法选项或赋值错误。具体导致异常的情况请查看讨论章节的关于异常情况

    例子

    1. # 声明变量,当然也欢迎您在这个网站(感谢本项目发起人 @jaywcjlove)查询linux命令。
    2. declare reference_website='https://wangchujiang.com/linux-command/'
    3. # 显示所有包含整型属性的变量和值。
    4. declare -i
    5. # 定义变量b并赋值为3,具有整型属性。
    6. declare -i b=5
    7. declare -p b
    8. # 删除整型属性。
    9. declare +i b
    10. # 显示属性,返回 declare -- b="5"。
    11. declare -p b
    12. # 根据变量属性强制转换值的英文大小写。
    13. declare -u uc_var='abc'
    14. declare -l lc_var='ABC'
    15. # 显示'ABC abc';
    16. echo "${uc_var} ${lc_var}"
    1. # 注意,不能使用 `+a` 或 `+A` 取消数组,也不能使用 `+r` 取消只读属性。
    2. # 定义只读数组,设置属性的同时定义赋值。
    3. declare -ar season=('Spring' 'Summer' 'Autumn' 'Winter')
    4. # 或者这样。
    5. season=('Spring' 'Summer' 'Autumn' 'Winter')
    6. declare -ar season
    7. declare -a
    8. # 定义关联数组。
    9. declare -A fruits=(['apple']='red' ['banana']='yellow')
    10. # 显示所有关联数组。
    11. declare -A
    1. # 显示全部函数名和函数定义。
    2. declare -f
    3. # 只显示全部函数名。
    4. # 定义两个函数。
    5. function func_a(){ echo $(date +"%F %T"); }
    6. function func_b(){ cd /; ls -lh --sort=time; }
    7. # 显示一到多个函数名和函数定义。
    8. declare -f func_a func_b
    9. # 只显示一到多个函数名,验证某个名称是否已经定义为函数时有用。
    10. declare -F func_a func_b
    11. # 最好不要让函数名和变量名相同。
    1. 全局和局部变量

      正如上面例子指出的情况,我们在日常编写程序的时候需要了解这些概念,在这里 做个简要地介绍,当然你也可以很方便的搜索到相关内容。

      • 全局变量:在整个脚本执行期间,只要没有被删除就一直存在
      • 局部变量:在函数内定义,函数执行后就被删除。

      相关资料:

    2. 为什么declare能做到的事,还需要定义其他这些命令呢?

      因为这样语句含义会更加明确,例如:

      • 设置导出属性的变量时,export vardeclare -x var
      • 在函数内声明变量时,使用local
      • 声明只读变量,使用readonly

      typesetdeclare命令一样。

    3. 有多种原因导致declare失败,关于这些情况可以参考,或执行 info bash 查看declare部分最后一大串an attempt is开头的句子。

    1. 该命令是bash内建命令,相关的帮助信息请查看命令。
    2. 导出属性的相关介绍请查看’export’命令。
    3. 只读属性的相关介绍请查看’readonly’命令。
    4. 引用属性的相关介绍请查看’unset’命令的例子部分。