Linux 命令之 declare -- 声明或显示 shell 变量

文章目录

  • 一、命令介绍
  • 二、命令格式
  • 三、命令选项
  • 四、命令示例
    • (一)声明变量并赋值
    • (二)将变量设置为环境变量
    • (三)将变量设置为只读,不可修改
    • (四)将变量声明为整数并进行计算
    • (五)显示变量的属性和值
    • (六)显示所有的变量
    • (七)显示所有的环境变量
    • (八)声明数组变量
    • (九)显示所有自定义函数的名称
    • (十)显示所有自定义函数,包括名称和函数体
    • (十一)显示指定函数的声明定义内容
    • (十二)声明一个整数型的变量,并给变量赋值

一、命令介绍

declare 命令是 bash 的一个内建命令,它可以用来声明 shell 变量、显示 shell 变量的值以及设置 shell 变量的属性。declare 声明定义的变量仅能在当前 shell 环境中起作用,切换 shell 环境后将无效。

declare 的功能与 typeset 命令的功能是相同的,不过 typeset 已经被弃用了,建议使用 declare 代替。

二、命令格式

declare [-aAfFgilnrtux] [-p] [var[=val] ...]

注:var 是变量名称,val 是变量的值

三、命令选项

选项说明
-f显示所有自定义函数,包括名称和函数体
-F显示所有自定义函数名称
-g在 Shell 函数内部创建全局变量
-p显示指定变量的属性和值,当使用此选项时,其他的选项将被忽略
-a声明数组变量
-A声明变量为关联数组(支持索引下标为字符串)
-i声明整数型变量。这样变量后面就可以跟着算术表达式,表达式的结果只能是整数。如果表达式求值失败或者不是整数,就设置为 0
-l给变量赋值时转为小写
-u给变量赋值时转为大写
-n使变量 var 成为指向一个以其值为名称的变量的引用
-r将变量 var 声明为只读变量。只读变量不允许修改,也不允许删除。等价于 readonly name
-t使变量 var 带有 trace(追踪)属性
-x将变量 var 导出,作用与 export 一样,将变量 var 设置成环境变量,这样在随后的脚本和程序中可以使用。等价于 export name[=value]

特别说明:

  1. + 代替 - 会关闭指定选项。例如,- 可用来指定变量的属性,+ 则是取消变量所设的属性。
  2. 带有整数属性的变量在赋值时将使用算术估值(见 let 命令)。
  3. 在函数中使用时,declare 使 var 成为本地变量,和 local 命令一致。-g 选项抑制此行为。

四、命令示例

(一)声明变量并赋值

方式一:declare var=value

[root@htlwk0001host ~]# declare sum=200+300
[root@htlwk0001host ~]# echo $sum
500

注:shell 自动判断表达式的数据类型,若都是整数型则计算结果,再赋值给变量,所以最后输出结果 500

方式二:typeset var=value 等价于 declare var=value

方式三:var=value

[root@htlwk0001host ~]# sum=200+300
[root@htlwk0001host ~]# echo $sum
200+300

注:此处并没有像我们想像中那样会得到结 500,而是 200+300,这是由于它是文字类型的变量属性。

(二)将变量设置为环境变量

将变量 var 设置成环境变量,这样在随后的脚本和程序中可以使用。

方式一:

[root@htlwk0001host ~]# declare -x var
[root@htlwk0001host ~]# declare -x var=value # 将变量 var 设置成环境变量,并赋值为 value

方式二:

[root@htlwk0001host ~]# typeset -x var

方式三:

[root@htlwk0001host ~]# export var

(三)将变量设置为只读,不可修改

[root@linux ~]# declare -r sum 
[root@linux ~]# sum=apple 
-bash: sum: readonly variable 
[root@linux ~]# unset sum 
-bash: unset: sum: cannot unset: readonly variable 

注:声明为只读变量之后,不能修改该变量的属性,也不能修改变量的值,也不能删除该变量,所以,在声明变量的时候,应该慎用,避免有去无回。另外,你在命令行中敲 readonly,你会发现有很多只读变量,当然这些变量也是不能修改或删除的。

(四)将变量声明为整数并进行计算

[root@linux ~]# declare -i m n ret  # 将多个变量声明为整数
[root@linux ~]# m=10
[root@linux ~]# n=30
[root@linux ~]# ret=$m+$n
[root@linux ~]# echo $ret
40

(五)显示变量的属性和值

其实就是现实变量的声明定义语句,如下所示:

[c.biancheng.net]$ declare -r n=10
[c.biancheng.net]$ declare -p n
declare -r n="10"

(六)显示所有的变量

[root@htlwk0001host ~]# declare -p
declare -- BASH="/bin/bash"
declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath"
declare -ir BASHPID
declare -- BASHRCSOURCED="Y"
declare -A BASH_ALIASES=()
declare -a BASH_ARGC=()
declare -a BASH_ARGV=()
declare -A BASH_CMDS=()

(七)显示所有的环境变量

[root@htlwk0001host ~]# declare -x
declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/0/bus"
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="htlwk0001host"
declare -x JAVA_HOME="/usr/java/latest"

(八)声明数组变量

将变量 var 声明为数组变量。但这没有必要。所有变量都不必显式定义就可以用作数组。事实上,在某种意义上,似乎所有变量都是数组,而且赋值给没有下标的变量与赋值给"var[0]"相同。

[root@jfht ~]#declare -a names # 声明一个数组变量叫names
[root@jfht ~]#names=Jack # 给数组赋值,没有具体指定下标,默认赋值给下标为0的位置,即等价于names[0]=Jack
[root@jfht ~]#echo ${names[0]} # 输出数组names下标为0的元素的值
Jack
[root@jfht ~]#names[1]=Bone  # 给数组names下标为1的位置赋值Bone
[root@jfht ~]#echo ${names[1]} 
Bone
[root@jfht ~]#echo ${names} # 没有指定下标,输出第一个元素的值。直接引用names,相当于引用names[0] 
Jack
[root@jfht ~]#echo ${names[*]} # '*'代表数组所有的元素
Jack Bone
[root@jfht ~]#echo ${#names} # 输出数组第一个元素的长度
4
[root@jfht ~]#echo ${#names[*]} # 输出数组的长度,即数组的元素个数
2
[root@jfht ~]#echo ${names[@]} # '@'与'*'类似
Jack Bone
[root@jfht ~]#echo ${#names[@]} # 输出数组的长度,即数组的元素个数
2
[root@jfht ~]#declare -p names # 查看变量的属性和值,即变量names的声明定义内容  
declare -a names='([0]="Jack" [1]="Bone")'
[root@jfht ~]# 

(九)显示所有自定义函数的名称

[root@htlwk0001host ~]# declare -F
declare -f __expand_tilde_by_ref
declare -f __get_cword_at_cursor_by_ref
declare -f __load_completion
declare -f __ltrim_colon_completions
declare -f __parse_options
declare -f __parse_vdo_options
...

(十)显示所有自定义函数,包括名称和函数体

[root@htlwk0001host ~]# declare -f 
__expand_tilde_by_ref () 
{ if [[ ${!1} == \~* ]]; thenif [[ ${!1} == */* ]]; theneval $1="${!1/%\/*}"/'${!1#*/}';elseeval $1="${!1}";fi;fi
}
__get_cword_at_cursor_by_ref () 
...

(十一)显示指定函数的声明定义内容

[root@htlwk0001host ~]# declare -f __expand_tilde_by_ref
__expand_tilde_by_ref () 
{ if [[ ${!1} == \~* ]]; thenif [[ ${!1} == */* ]]; theneval $1="${!1/%\/*}"/'${!1#*/}';elseeval $1="${!1}";fi;fi
}
[root@htlwk0001host ~]# 

(十二)声明一个整数型的变量,并给变量赋值

[root@htlwk0001host ~]# declare -i var
[root@htlwk0001host ~]# var=6/3
[root@htlwk0001host ~]# declare -p var
declare -i var="2"
[root@htlwk0001host ~]# echo $var
2

给整数型的变量赋予非整数型的值,结果变成0,如下所示:

[root@htlwk0001host ~]# var=error
[root@htlwk0001host ~]# echo $var
0
[root@htlwk0001host ~]# 

如果变量被声明成整数,把一个小数(浮点数)赋值给它时,也是不行的。因为bash并不内置对浮点数的支持,如下所示:

[root@htlwk0001host ~]# var=3.14 
-bash: 3.14: syntax error: invalid arithmetic operator (error token is ".14")

取消变量 var 的整数类型属性,如下命令:

[root@htlwk0001host ~]# declare +i var
[root@htlwk0001host ~]# var=6/3 
[root@htlwk0001host ~]# echo $var 
6/3

因为变量 var 不是整型变量,所以不会自动对除法的表达式求值。可以采用下面两个方式:

[root@htlwk0001host ~]# x=$[6/3] 
[root@htlwk0001host ~]# echo $x
2
[root@htlwk0001host ~]# x=$((6/3)) 
[root@htlwk0001host ~]# echo $x  
2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库应用_MySQL数据库应用 从入门到精通 学习笔记

以下内容是学习《MySQL数据库应用 从入门到精通》过程中总结的一些内容提要,供以后自己复现使用。一:数据库查看所有数据库:SHOW DATABASES创建数据库:CREATE DATABSE database_name切换数据库:USE database_name删除数据库:DROP DATABASE database_name…

Linux 命令之 env -- 显示系统的环境变量,定义执行命令时的环境变量

文章目录一、命令介绍二、选项参数三、命令示例(一)显示系统的环境变量(二)从当前环境中删除指定的变量(三)定义指定的环境变量(四)在一个修改后的环境下执行命令一、命令介绍 env命…

aws lambda_跑来跑去:假人与AWS Lambda的第一次接触

aws lambda这一切始于埃及人在一个木框上滑动几块大理石以简单的算术使其大脑放松的时候。 或许是希腊人发明了Antikythera机制来追踪行星的运动至每千年2度的精度 。 无论哪种方式,计算都已经走了很长一段路:查尔斯巴贝奇的分析引擎 ,艾伦图…

Linux 命令之 set -- 显示或设置 shell 特性及 shell 变量

文章目录一、命令介绍二、选项参数三、命令示例(一)开启/关闭特性(二)将普通变量设为环境变量一、命令介绍 set 命令作用主要是显示系统中已经存在的 shell 变量,设置 shell 变量的新变量值,可以把已有的变…

Linux 命令之 unset -- 删除指定的shell变量或函数

文章目录一、命令介绍二、选项参数三、命令示例(一)删除指定的环境变量一、命令介绍 unset 为 shell 内建指令,用于删除已定义的shell变量(包括环境变量)和shell函数。unset命令不能够删除具有只读属性的shell变量和环…

带有Jersey的RESTful Web服务的JAX-RS教程

在当今世界,数据起着非常重要的作用。 如此众多的应用程序将各种类型的数据用于不同的操作,所以最重要的方面是应用程序之间的通信。 当应用程序之间可以通信时,数据共享变得容易。 就像在亚洲运行的应用程序向在欧洲运行的应用程序提供数据…

mysql --force -f_Mysql_mysql force Index 强制索引

其他强制操作,优先操作如下:mysql常用的hint对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法。同样,在mysql里,也有类似的hint功能。下面介绍一些常用的。强制索…

Linux 查看文件位置/查看文件路径的命令

which 查看可执行文件的位置find 实际搜寻硬盘查询文件名称whereis 查看文件的位置locate 配合数据库查看文件的位置

抽象工厂模式设计模式_创新设计模式:抽象工厂模式

抽象工厂模式设计模式抽象工厂模式是一种创新模式,是与构建器和工厂模式一起最受欢迎的模式之一。 使用创建模式是为了创建对象,而不是直接使用构造函数创建对象。 抽象工厂模式提供了一种封装一组具有共同主题的单个工厂而无需指定其具体类的方法。 采…

dubbo protocol port 消费者端_Dubbo源码:搞定URL,就走完了进度条的一半

Dubbo 中的 URL大家都知道,在互联网领域,每个信息资源都有统一的且在网上唯一的地址,该地址就叫 URL(Uniform Resource Locator,统一资源定位符),它是互联网的统一资源定位标志,也就…

swarm 容器_Oracle应用容器云上的WildFly Swarm

swarm 容器在此博客文章中,我将描述如何将打包在WildFly Swarmber -jar中的CloudEE Duke应用程序部署到Oracle Application Container Cloud 。 在Oracle Application Container Cloud中进行部署所需的部署工件是一个ZIP归档文件,其中包含应用程序ber-j…

mysql数据库文件还原数据库_MySql通过数据库文件恢复数据库

以表”Table”为例:如类型是MyISAM, 数据文件则以”Table.frm””Table.MYD””Table.MYI””三个文件存储于”/data/$databasename/”目录中.如类型是InnoDB, 数据文件则存储在”$innodb_data_home_dir/″中的ibdata1文件中(一般情况),结构文件存在于table_name.fr…

yum 如何知道从哪里下载包?

包来自什么地方呢?yum 如何知道从哪里下载包?起点是 /etc/yum.repos.d/ 目录,这个目录常常包含几个 repo 文件。这是 repo 的默认位置,但是可以在 YUM 配置文件(通常是 /etc/yum.conf)中指定其他位置。清单…

mysql主从修改系统参数步骤_mysql主从配置的参数配置与步骤_MySQL

mysql主从配置的参数配置与步骤_MySQL主从配置的步骤:在主库建立要同步的数据库,建立主库的帐号和修改主备库配置create database web default character set utf8grant replication slave on *.* to repdcssub192.168.191.112 identified by 123456;grant all priv…

javascript 解密_Javascript中的AES加密和Java中的解密

javascript 解密AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本,例如密码,然后将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加容易在相同的平台&#xff0…

英文标点符号大全

标点符号英文中文名称未知反撇号’apostrophe撇号,缩写及所有格符号plus加号;正号-minus减号;负号plus or minus正负号is multiplied by乘号is divided by除号=is equal to等于号≠is not equal to不等于号≡is equivalent to全等…

Linux 系统下显示文件内容(查看文件内容)的命令 more/less/cat/head/tail 比较

命令说明more建议用于查看内容较长的文本文件,内容可以分屏显示,并且支持在显示时定位关键字cat建议用于查看内容较少的文本文件。当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因…

mysql子分区多少层_MySQL 子分区-阿里云开发者社区

介绍子分区其实是对每个分区表的每个分区进行再次分隔,目前只有RANGE和LIST分区的表可以再进行子分区,子分区只能是HASH或者KEY分区。子分区可以将原本的数据进行再次的分区划分。一、创建子分区子分区由两种创建方法,一种是不定义每个子分区…

gradle 编译java_Java的Gradle依赖关系,使用编译还是实现?

gradle 编译java当我向一位同事解释如何将Gradle用于Java项目时(他正在远离Maven ),我们遇到了各种代码示例。 一些示例将编译配置用于依赖项,而其他示例则使用Implements和api 。 dependencies { compile commons-httpclient:co…

Linux 命令之 typeset -- 声明 shell 变量,设置变量的属性

文章目录一、命令介绍二、常用选项三、命令示例(1)定义关联数组并访问一、命令介绍 typeset 命令是 bash 的内建命令,是命令 declare 的别名,两者是完全一样的,用来声明 shell 变量,设置变量的属性。 用于…