您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

declare

语法

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

主要用途

  • 显示包含指定属性的全部变量和值

  • 显示包含指定属性的一到多个变量和值

  • 显示一到多个变量的属性和值

  • 显示所有变量的属性和值并显示函数的定义

  • 显示所有变量的属性和值

  • 显示所有全局变量的属性和值

  • 显示全部函数名和函数定义

  • 只显示全部函数名

  • 显示一到多个函数名和函数定义

  • 只显示一到多个函数名

  • 声明全局变量(可选:赋值)

  • 声明变量(可选:赋值、属性)

  • 增加、删除变量的属性(可选:赋值)

    选项

    shell
    -f 将操作或显示限制为函数名及函数定义。
    -F 只显示函数名(调试时附加行号和源文件)。
    -g 在shell函数中使用时创建全局变量;其他情况下忽略。
    -p 显示每个名称的属性和值。
    
    *设置属性的选项:
    -a 创建数组(如果支持)。
    -A 创建关联数组(如果支持)。
    -i 增加整型属性。
    +i 删除整型属性。
    -l 增加小写属性,变量的值将转换为小写。
    +l 删除小写属性。
    -n 增加引用属性(如果该选项存在)。
    +n 删除引用属性(如果该选项存在)。
    -r 增加只读属性。
    -t 增加追踪属性。
    +t 删除追踪属性。
    -u 增加大写属性,变量的值将转换为大写。
    +u 删除大写属性。
    -x 增加导出属性。
    +x 删除导出属性。
    

    参数

    shell
    name(可选):变量名或函数名。
    value(可选):变量的值。
    

    返回值

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

    例子

    shell
    <h1>声明变量,当然也欢迎您在这个网站(感谢本项目发起人 @jaywcjlove)查询linux命令。</h1>
    declare reference_website='https://wangchujiang.com/linux-command/'
    
    <h1>显示所有包含整型属性的变量和值。</h1>
    declare -i
    <h1>定义变量b并赋值为3,具有整型属性。</h1>
    declare -i b=5
    <h1>显示属性,返回 declare -i b="5"。</h1>
    declare -p b
    <h1>删除整型属性。</h1>
    declare +i b
    <h1>显示属性,返回 declare -- b="5"。</h1>
    declare -p b
    <h1>根据变量属性强制转换值的英文大小写。</h1>
    declare -u uc_var='abc'
    declare -l lc_var='ABC'
    <h1>显示'ABC abc';</h1>
    echo "${uc_var} ${lc_var}"
    
    shell
    <h1>定义函数内的全局变量</h1>
    function test(){
      declare -g a=3
      # 或者
      local -g b=3
      # 或者
      c=3
      # 让我们查看它们的属性。
      declare -p a b c
    }
    <h1>执行函数。</h1>
    test
    <h1>返回结果。</h1>
    <h1>declare -- a="3"</h1>
    <h1>declare -- b="3"</h1>
    <h1>declare -- c="3"</h1>
    
    <h1>定义函数外的全局变量</h1>
    declare a=3
    b=3
    declare –p a b
    <h1>返回结果如下。</h1>
    <h1>declare -- a="3"</h1>
    <h1>declare -- b="3"</h1>
    
    <h1>定义局部变量</h1>
    function test2(){
      local -i a=3
      declare -i b=3
    }
    test2
    <h1>没有该变量(已经被销毁了)</h1>
    echo "${a} ${b}"
    <h1>因此,我们日常脚本中最常见的类似于'a=3'实际上是声明并赋值了一个全局变量。</h1>
    <h1>在接下来的 <strong>讨论</strong> 环节会延伸讨论全局和局部变量问题。</h1>
    
    shell
    <h1>注意,不能使用 <code>+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
    shell
    <h1>显示所有变量的属性和值并显示函数的定义,输出很长。</h1>
    declare
    <h1>显示所有变量的属性和值。</h1>
    declare -p
    <h1>显示所有全局变量的属性和值。</h1>
    declare -g
    
    shell
    <h1>显示全部函数名和函数定义。</h1>
    declare -f
    <h1>只显示全部函数名。</h1>
    declare -F
    
    <h1>定义两个函数。</h1>
    function func_a(){ echo $(date +"%F %T"); }
    function func_b(){ cd /; ls -lh --sort=time; }
    <h1>显示一到多个函数名和函数定义。</h1>
    declare -f func_a func_b
    <h1>只显示一到多个函数名,验证某个名称是否已经定义为函数时有用。</h1>
    declare -F func_a func_b
    <h1>最好不要让函数名和变量名相同。</h1>
    

    讨论

  1. 全局和局部变量

    正如上面例子指出的情况,我们在日常编写程序的时候需要了解这些概念,在这里

    做个简要地介绍,当然你也可以很方便的搜索到相关内容。

    - 全局变量:在整个脚本执行期间,只要没有被删除就一直存在

    - 局部变量:在函数内定义,函数执行后就被删除。

    建议函数内使用local命令,函数外使用declare命令。

    > *不要在脚本中定义过多的全局变量,那样可能会被其他函数调用造成意料之外的后果,并且也不方便检查出来。*

    >

    > *更不用说缺乏必要的注释了 —— ZhuangZhu-74*

    相关资料:

    - [google提供的编码规范](https://github.com/google/styleguide)

    - [全局变量的讨论](https://unix.stackexchange.com/questions/381761/what-do-declare-name-and-declare-g-do)

  1. 关于declare typeset export local readonly命令

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

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

    - 设置导出属性的变量时,export vardeclare -x var

    - 在函数内声明变量时,使用local

    - 声明只读变量,使用readonly

    typesetdeclare命令一样。

  1. 关于异常情况

    有多种原因导致declare失败,关于这些情况可以参考[bash在线文档declare部分\(最新版\)](https://www.gnu.org/software/bash/manual/bash.html#index-declare),或执行 info bash

    查看declare部分最后一大串an attempt is开头的句子。

    注意

  1. 该命令是bash内建命令,相关的帮助信息请查看help命令。

  1. 导出属性的相关介绍请查看'export'命令。

  1. 只读属性的相关介绍请查看'readonly'命令。

  1. 引用属性的相关介绍请查看'unset'命令的例子部分。