declare

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’命令的例子部分。

若文章对你有帮助,可以点赞或打赏支持我们。发布者:Aurora,转载请注明出处:http://61.174.243.28:13541/AY-knowledg-hub/declare/

(0)
AuroraAurora站点维系者
上一篇 2023年 12月 7日 下午7:21
下一篇 2023年 12月 7日 下午7:21

相关推荐

  • named-checkzone

    文章目录named-checkzone补充说明语法选项例子 named-checkzone 使用named-checkzone命令可以进行区域文件有效性检查和转换,必须指定区域名称…

    入门教程 2024年 1月 10日
  • git 图形桌面推荐

    目前主流跨平台开发工具,个人比较推荐使用vscvsc支持多种代码插件,且完全免费开源。 VSCode+git+gitGraph VSC: https://code.visualst…

    2024年 4月 30日
  • pvcreate

    文章目录pvcreate补充说明语法选项参数实例 pvcreate 将物理硬盘分区初始化为物理卷 补充说明 pvcreate命令 用于将物理硬盘分区初始化为物理卷,以便LVM使用。…

    入门教程 2024年 3月 1日
  • sftp

    文章目录sftp补充说明语法选项参数实例 sftp 交互式的文件传输程序 补充说明 sftp命令 是一款交互式的文件传输程序,命令的运行和使用方式与ftp命令相似,但是,sftp命…

    入门教程 2024年 3月 4日
  • parted

    文章目录parted补充说明语法选项参数实例 parted 磁盘分区和分区大小调整工具 补充说明 parted命令 是由GNU组织开发的一款功能强大的磁盘分区和分区大小调整工具,与…

    入门教程 2024年 3月 1日
  • script

    文章目录script补充说明语法选项参数实例 script 记录终端会话的所有操作 补充说明 script 用于在终端会话中,记录用户的所有操作和命令的输出信息。简而言之,记录终端…

    入门教程 2024年 3月 4日
  • gzip

    文章目录gzip补充说明语法选项参数实例 gzip 用来压缩文件 补充说明 gzip命令 用来压缩文件。gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多处“.gz”…

    入门教程 2023年 12月 14日
  • sed

    文章目录sed补充说明sed的选项、命令、替换标记选项参数sed命令sed替换标记sed元字符集sed用法实例替换操作:s命令全面替换标记g定界符删除操作:d命令已匹配字符串标记&…

    入门教程 2024年 3月 4日
  • dpkg-reconfigure

    文章目录dpkg-reconfigure补充说明语法选项参数实例 dpkg-reconfigure Debian Linux中重新配制一个已经安装的软件包 补充说明 dpkg-re…

    入门教程 2023年 12月 7日
  • Java 包(package)

    为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。 文章目录包的作用创建包例子Animal.java 文件代码:MammalInt.java 文件代码:import…

    入门教程 2023年 3月 9日
Translate »