1、declare命令介绍

Shell中所有变量的默认类型是字符串类型,如果你需要进行特殊数据类型进行运算,使用declare命令就可以实现声明变量的类型。

declare命令是一个内置命令,命令如下:

[root@localhost ~]# declare [+/-] [选项] 变量名

选项:
-: 给变量设定类型属性。
+: 取消变量的类型属性。
-а: 将变量声明为数组型。
-i: 将变量声明为整数型(integer)。
-r: 将变量声明为只读变量。
注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,
甚至不能通过+r取消只读属性。
-x: 将变量声明为环境变量。
-p: 显示指定变量的被声明的类型。

注意:

Shell中就识别上边这些数据类型,像日期类型,布尔类型等,Shell中默认是不支持的。

其实这样做的目的都是为了降低Shell的难度。

示例:

# 定义两个变量,进行求和
[root@Lyl tmp]# a=1
[root@Lyl tmp]# b=2
[root@Lyl tmp]# c=$a+$b
[root@Lyl tmp]# echo $c
1+2 # 可以看上在Shell中,变量值的默认类型是字符串。
# 如果我们要把1和2变成数字类型,就需要适用declare命令。 # 给变量aa和bb赋值
[root@Lyl tmp]# aa=11
[root@Lyl tmp]# bb=22 # 声明变量cc的类型是整数型,它的值是aa和bb的和。
# 这里注意一下,其实应该把变量aa和bb也通过declare命令声明成数值型,
# 但是Shell这点还好,只把最后的和cc声明成数值型,也是能进行计算的。
[root@Lyl tmp]# declare -i cc=$aa+$bb # 输出变量cc
[root@Lyl tmp]# echo $cc
33

Shell在数值运算这里确实是比较麻烦,习惯就好了。

2、声明数组变量类型

数组就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的元素,有时也称为下标变量。

用白话说,变量和数组都是用来保存数据的,只是变量只能赋予一个数据值,一旦重复赋值,后边的值就会覆盖前边值。而数组是可以赋予一组相同类型的数据值。

大家可以把变量想象成一个小办公室,这个办公室只能容纳一个人办公,办公室名就是变量名。而数组是一个大办公室,可以容纳很多人同时办公,在这个大办公室的每个人是通过不同的座位号来区分的,这个座位号就是数组的下标,而大办公室的名字就是数组名。

数组的下标是从0开始的,在调用数组值时,需要使用${数组[下标]}的方式来读取。

数组基本用法示例:

# 我们先来定义一个变量test。
[root@Lyl ~]# test=123
[root@Lyl ~]# echo $test
123
# 修改test变量的值,则直接覆盖原有值。
[root@Lyl ~]# test=456
[root@Lyl ~]# echo $test
456 # 数组
# 定义一个数组,添加西游记四个主人公,并查看
[root@Lyl ~]# declare -a name[0]="tangc"
[root@Lyl ~]# declare -a name[1]="sunwk"
# 注意:在定义数组的时候,不用写declare -a 系统也能识别你定义的是一个数组,
# 因为定义数组的格式比较特殊,不用强制声明。
[root@Lyl ~]# name[2]="zhubj"
[root@Lyl ~]# name[3]="shahs" # 查看数组内容
# 如果我们使用查看变量的方式查看数组,
# 则会只显示数组用的第一个元素,也就是0号标元素。
[root@Lyl ~]# echo $name
tangc # 查看数组元素的标准方式。
[root@Lyl ~]# echo ${name[2]}
zhubj # 查看数组中所有的元素
[root@Lyl ~]# echo ${name[*]}
tangc sunwk zhubj shahs

提示:

Shell中的数组和Java中的数组,用法上差不多,但是Shell的数组是没有定义数组相关函数的。

可能开发Shell的人认为,Shell不可能用于开发算法类的东西,Shell本意是用来帮助Linux管理员高效的完成工作,降低管理难度的。(如果需要写一些算法,还是用那些高级语言去写。)

因此数组在Shell中的作用就大幅度下降了。

3、声明变量为环境变量

可以使用declare -x命令把变量声明为环境变量,和export命令的作用是一样的。

我们通过declare -p命令,显示所有被declare声明的变量,就可以看到里边有很多被declare -x命令声明的变量,也就是环境变量。

准确的说export命令是declare -x命令的一种简易写法。也就是说,执行export命令定义一个环境变量,最终也是执行的declare -x命令。

示例:

# 直接输入`declare -p`命令是查看所有的declare声明的变量。
# 查看指定declare声明的变量,
# 就以上边定义的test变量为例。
[root@Lyl ~]# declare -p test
declare -- test="456" # 通过`export`命令把test变量声明成环境变量。
[root@Lyl ~]# export test
[root@Lyl ~]# declare -p test
declare -x test="456" # 通过`declare +x`命令把test变量声明成普通变量。
[root@Lyl ~]# declare +x test
[root@Lyl ~]# declare -p test
declare -- test="456" # 通过`declare -x`命令把test变量声明成环境变量。
[root@Lyl ~]# declare -x test
[root@Lyl ~]# declare -p test
declare -x test="456" # 所以`export 变量名` 和 `declare -x 变量名`作用相同。
# export更好记忆。

4、声明只读属性

一旦给变量设定了只读属性,那么这个变量既不能修改变量的值,也不能删除变量,甚至不能使用"+r"选项取消只读属性。

换种说法,其实就是把Shell中的一个变量,变成了常量。

命令如下:

# 定义一个普通变量test,并通过declare命令查看。
[root@Lyl ~]# declare -p test
declare -- test="456" # 将test变量赋予只读属性。
[root@Lyl ~]# declare -r test
[root@Lyl ~]# declare -p test
declare -r test="456" # 修改test变量的值,发现不能被修改。
[root@Lyl ~]# test=666
-bash: test: readonly variable # test变量也不能取消只读属性。
[root@Lyl ~]# declare +r test
-bash: declare: test: readonly variable # test变量也不能删除
[root@Lyl ~]# unset test
-bash: unset: test: cannot unset: readonly variable

提示:不过declare -r命令是临时生效,所以只要重新登录或重启,这个变量就会消失了。如果是要写在配置文件中只读变量,这个变量就永远不能修改了。

5、补充:

declare命令其他常用属性,用法同上。

-f 显示函数名及函数定义。
-F 只显示函数名(调试时附加行号和源文件)。
-l 增加小写属性,变量的值将转换为小写。
+l 删除小写属性。
-u 增加大写属性,变量的值将转换为大写。
+u 删除大写属性。

『忘了再学』Shell基础 — 19、使用declare命令声明变量类型的更多相关文章

  1. 『忘了再学』Shell基础 — 3、echo命令的介绍与使用

    目录 1.echo命令的作用 2.echo命令的基本用法 3.echo命令的-e选项用法 4.echo命令一些特殊用法 (1)输出字符带有字体颜色 (2)输出字符带有背景颜色 在讲Shell脚本之前, ...

  2. 『忘了再学』Shell基础 — 30、sed命令的使用

    目录 1.sed命令说明 2.行数据操作 (1)查看文件中的数据 (2)删除文件中的数据 (3)向文件中追加数据 (4)向文件中插入数据 (5)修改文件中的多行数据(删除,追加,插入) (6)替换文件 ...

  3. 『忘了再学』Shell基础 — 29、AWK内置变量

    目录 1.AWK内置变量 2.练习说明 (1)$n变量练习 (2)FS变量练习 (3)NF变量和NR变量练习 3.总结: 1.AWK内置变量 AWK内置变量如下表: awk内置变量 作用 $0 代表目 ...

  4. 『忘了再学』Shell基础 — 22、主要的环境变量配置文件说明

    目录 1.source命令 2.Linux系统中环境变量配置文件 (1)登录时生效的环境变量配置文件 (2)/etc/profile环境变量配置文件 (3)/etc/profile.d/*.sh环境变 ...

  5. 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

    提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...

  6. 『忘了再学』Shell基础 — 20、Shell中的运算符

    目录 1.Shell常用运算符 2.Shell中数值运算的方法 (1)方式一 (2)方式二 (3)方式三(推荐) 1.Shell常用运算符 Shell中常用运算符如下表: 优先级数值越大优先级越高,具 ...

  7. 『忘了再学』Shell基础 — 1、Shell的介绍

    目录 1.Shell的由来 2.Shell的两种执行指令方式 3.什么是Shell脚本 4.Shell 是一种脚本语言 1.Shell的由来 我们比较熟悉Windows系统的图形化界面,对于图形界面来 ...

  8. 『忘了再学』Shell基础 — 9、Bash中的特殊符号(一)

    目录 1.双单引号 2.双引号 3.$符号 4.反引号 5.$()符号 6.#符号 7.\符号 1.双单引号 '':单引号.在单引号中所有的特殊符号,如$和"`"(反引号)都没有特 ...

  9. 『忘了再学』Shell基础 — 11、变量定义的规则和分类

    目录 1.定义变量的规则 2.变量的分类 1.定义变量的规则 在定义变量时,有一些规则需要遵守 变量名称可以由字母.数字和下划线组成,但是不能以数字开头.如果变量名是2name则是错误的. 在Bash ...

随机推荐

  1. CSS - 定位属性position使用详解(static、relative、fixed、absolute)

    position 属性介绍 (1)position 属性自 CSS2 起就有了,该属性规定元素的定位类型.所有主流浏览器都支持 position 属性. (2)position 的可选值有四个:sta ...

  2. 有关表单autocomplete = "off" 失效问题解决方案

    一.autocomplete介绍 autocomplete是Html5中的新属性.该属性规定输入字段是否应该启用自动完成功能.自动完成允许浏览器预测对字段的输入.当用户在字段开始键入的时候,浏览器基于 ...

  3. java中如何能把一个字符串转成日期对象

    题目3.1: 把一个字符串转成日期对象 当我们想根据输入字符串得到一个日期对象时我们不知道,应该以什么格式写这个字符串,才能被系统正确解析,一种聪明的做法是,马克-to-win,我们先 把日期对象根据 ...

  4. scss使用方法以及相关内容

    我们平时都称之为 Sass,其实可分成sass和scss, 其中Sass 是以严格的缩进式语法规则来书写,不带大括号({})和分号(;),以".sass"后缀为扩展名:而 SCSS ...

  5. Java报错:Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.4.26.v20200117:run (default-cli) on project ssm-mybatis-plus: Failure

    修改一下端口就好了,不要用80端口. <plugin> <groupId>org.eclipse.jetty</groupId> <!--嵌入式Jetty的M ...

  6. Java实现单链表的合并(保证数据的有序性)

    一.思路 1.比较两个链表的大小 2.将小链表插入到大链表中 3.使用插入保证链表数据的有序性 二.核心代码 /** * 合并两个链表,并且按照有序合并 * @param singleLinkedLi ...

  7. PostgreSQL常用初级技能树

    1.创建表需要id自增 设置serial即可,示例: id serial not null 2.创建表没有设置后面想要再设置自增 给test表设置一个自增序列test_id_seq CREATE SE ...

  8. [翻译] Cassandra 分布式结构化存储系统

    Cassandra 分布式结构化存储系统 摘要 Cassandra 是一个分布式存储系统,用于管理分布在许多商品服务器上的大量结构化数据,同时提供无单点故障(no single point of fa ...

  9. Codeforces Round #753 (Div. 3), problem: (D) Blue-Red Permutation

    还是看大佬的题解吧 CFRound#753(Div.3)A-E(后面的今天明天之内补) - 知乎 (zhihu.com) 传送门  Problem - D - Codeforces 题意 n个数字,n ...

  10. 国产化之银河麒麟.netcore3.1访问https服务的两个问题

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等. 考虑到这些基础产品对.NETCore的支持,最终选择了3.1版 ...