1、什么是变量的测试与内容置换

我们之前说过,在Shell中,一个变量未定义,和一个变量为空值的输出效果是一样的。

# 先直接输出一个未定义的变量y
[root@Lyl ~]# echo $y # 再定义变量y为空值,并输出变量y
[root@Lyl ~]# y=""
[root@Lyl ~]# echo $y [root@Lyl ~]#

其结果都是没有任何显示。

前边在说set命令的时候说过,执行set -u命令后,如果一个变量不存在,则会报错。如果变量为空,则会显示空。

# 先直接输出一个未定义的变量x,结果会报错。
[root@Lyl ~]# echo $x
-bash: x: unbound variable # 再定义一个空值y,结果就显示为空。
[root@Lyl ~]# y=""
[root@Lyl ~]# echo $y [root@Lyl ~]#

所以通过set -u可以让我们分清楚Shell中的一个变量是未定义的还是有空值的。

但是人执行命令看提示,是可以区分变量未定义和空值的情况。那如何让Shell程序来判断,一个Shell变量是否存在还是有空值,还是有值。(人肉眼能看到的,不见得程序能识别)

当然我们可以识别提示,并根据提示内容做判断来区分,也是很麻烦的。

Shell觉得我们面对上面的情况会频率很高,所以Shell帮我们准备了判断上述情况的表达式。

我们先来看一个变量的测试与内容置换的例子,如下:

变量置换方式 变量y没有设置(未定义) 变量y为空值 变量y设置值
x=${y-新值} x=新值 x为空值 x=$y

说明:

x=${y-新值}的意思是,通过${y-新值}表达式,来判断变量x的值是什么。

如果变量y的值未定义,则变量x的值等于新值;

如果变量y的值是空,则变量x的值也为空(其实就是x=$y);

如果变量y有值,则变量x的值等于变量y的值。

这个变量的测试,是测试的变量y是否有值,无值,还是未定义。

然后再把结果赋值给变量x。

同理通过变量x的值,也可以判断变量y的情况是什么。

2、变量的测试与内容置换

变量置换方式 变量y没有设置(未定义) 变量y为空值 变量y设置值
x=${y-新值} x=新值 x为空值 x=$y
x=${y:-新值} x=新值 x=新值 x=$y
x=${y+新值} x为空值 x=新值 x=新值
x=${y:+新值} x为空值 x为空值 x=新值
x=${y=新值} x=新值
y=新值
x为空值
y值不变
x=$y
y值不变
x=${y:=新值} x=新值
y=新值
x=新值
y=新值
x=$y
y值不变
x=${y?新值} 新值输出到标准错误输出(就是屏幕) x为空值 x=$y
x=${y:?新值} 新值输出到标准错误输出 新值输出到标准错误输出 x=$y

说明:

  • 如果大括号内没有:,则变量y是为空,还是没有设置,处理方法是不同的;

    如果大括号内有:,则变量y不论是为空,还是没有没有设置,处理方法是一样的。
  • 如果大括号内是-+,则在改变变量x值的时候,变量y是不改变的;

    如果大括号内是=,则在改变变量x值的同时,变量y的值也会改变。
  • 如果大括号内是?,则当变量y不存在或为空时,会把“新值”当成报错输出到屏幕上。

3、示例

例1:

# 情况1:有一个变量y,未被定义
# 进行测试
[root@Lyl ~]# x=${y-new} # 因为变量y不存在,所以x=new
[root@Lyl ~]# echo $x
new # 查看变量y,但是变量y还是不存在的
[root@Lyl ~]# echo $y [root@Lyl ~]# # 情况2:变量y为空
# 定义变量y为空
[root@Lyl ~]# y="" # 进行测试
[root@Lyl ~]# x=${y-new} # 变量x和变量y值都是空
[root@Lyl ~]# echo $x [root@Lyl ~]# echo $y [root@Lyl ~]# # 情况3:变量y有值
# 给变量y赋值
[root@Lyl ~]# y=old # 进行测试
[root@Lyl ~]# x=${y-new} # 变量x和变量y的值都是old
[root@Lyl ~]# echo $x
old
[root@Lyl ~]# echo $y
old
[root@Lyl ~]#

例2:

# =号的练习

# 情况1:有一个变量y,未被定义
# 进行测试
[root@Lyl ~]# x=${y:=new} # 变量x和变量y的值都是new
[root@Lyl ~]# echo $x
new
[root@Lyl ~]# echo $y
new # 注意:
# 一旦使用“=”号,那么变量y和变量x都会同时进行处理,
# 而不像例子1中只改变变量x的值。 # 情况2:变量y为空
# 定义变量y为空
[root@Lyl ~]# y="" # 进行测试
[root@Lyl ~]# x=${y:=new} # 变量x和变量y的值都是new
[root@Lyl ~]# echo $x
new
[root@Lyl ~]# echo $y
new # 注意;
# 一旦在大括号中使用":",那么变量y为空或者不设定,处理方式都是一样的了。 # 情况3:变量y有值
# 给变量y赋值
[root@Lyl ~]# y=old # 进行测试
[root@Lyl ~]# x=${y:=new} # 变量x和变量y的值都是old
[root@Lyl ~]# echo $x
old
[root@Lyl ~]# echo $y
old

例3:

# ?号的练习

# 情况1:有一个变量y,未被定义
# 进行测试
# 会把值"new"输出到屏幕上。
[root@Lyl ~]# x=${y?new}
-bash: y: new # 情况2:变量y为空
# 定义变量y为空
[root@Lyl ~]# y="" # 进行测试
[root@Lyl ~]# x=${y?new} # 变量x和变量y值都是空
[root@Lyl ~]# echo $x [root@Lyl ~]# echo $y [root@Lyl ~]# # 情况3:变量y有值
# 给变量y赋值
[root@Lyl ~]# y=old # 进行测试
[root@Lyl ~]# x=${y?new} # 变量x和变量y的值都是old
[root@Lyl ~]# echo $x
old
[root@Lyl ~]# echo $y
old

『忘了再学』Shell基础 — 21、变量的测试与内容置换的更多相关文章

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

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

  2. 『忘了再学』Shell基础 — 16、位置参数变量

    目录 1.位置参数变量$n 2.位置参数变量$*和$@ 3.位置参数变量$# 位置參数变量的作用主要用于脚本的传参. 位置參数变量的名称和作用都是确定不能改变的,但是该变量的内容是可以更改的,也就是变 ...

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

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

  4. 『忘了再学』Shell基础 — 17、预定义变量

    目录 1.预定义变量$? 2.预定义变量$$和$! 我们之前说过,Shell中的变量不是按照变量值的类型来进行分类的,而是按照Linux系统中定义的变量类别来分类的. 预定义变量就是,事先把变量的名称 ...

  5. 『忘了再学』Shell基础 — 19、使用declare命令声明变量类型

    目录 1.declare命令介绍 2.声明数组变量类型 3.声明变量为环境变量 4.声明只读属性 5.补充: 1.declare命令介绍 Shell中所有变量的默认类型是字符串类型,如果你需要进行特殊 ...

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

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

  7. 『忘了再学』Shell基础 — 24、Shell正则表达式的使用

    目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...

  8. 『忘了再学』Shell基础 — 25、扩展正则表达式

    目录 1.扩展正则表达式说明 2.练习 (1)+和?练习 (2)|和()练习 3.注意(重点) 1.扩展正则表达式说明 熟悉正则表达式的童鞋应该很疑惑,在其他的语言中是没有扩展正则表达式说法的,在Sh ...

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

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

随机推荐

  1. c++实现职责链模式--财务审批

    内容: 某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审批20万元及以下的采购单,20 ...

  2. 【uniapp 开发】字典工具类 ObjectUtil

    {__/} ( • - •) /つ寿司 你要不要? {__/} ( • - •) /つ草莓 你要不要? {__/} ( • - •) /つ披萨 你要不要? {__/} ( • - •) /つ桃子 你要 ...

  3. java中this这个概念初学者非常难理解,请举例说明

    4.this关键字(this key word) 继上一小节,(3.一个对象可能有多个参考)this是当中的一个参考!指向他自己. class MyTestDate {    int year;    ...

  4. 微信小程序支付框样式以及功能

    1.页面代码 <view catchtap='showInputLayer' class="btn_pay">立即支付</view> <!-- 密码输 ...

  5. vue上拉加载下拉加载

    npm i vue-scroller <scroller :on-refresh="refresh" :on-infinite="infinite" :n ...

  6. 适配手机端rpx像素

    <script src="static/js/adaptive.js"></script> <script type="text/javas ...

  7. 中小学数学卷子自动生成程序--对G同学的代码分析

    前几天,在课程要求下完成了个人项目的项目工程编写,即一个中小学数学卷子自动生成程序. 程序主要功能是用户预设账户登录后可以选择等级进行对应的小中高的数学卷子对应出题生成txt文本. 本文针对partn ...

  8. WIN进程注入&BypassUAC&令牌窃取

    WIN进程注入&BypassUAC&令牌窃取 本地提权-win令牌窃取 假冒令牌可以假冒一个网络中的另一个用户进行各类操作. 所以当一个攻击者需要域管理员的操作权限时候,需通过假冒域管 ...

  9. 体育类1.2.0版本 带有社交性质的 app 并且有内购功能

    上架经历 体育类1.2.0版本 应用是体育类的,带有社交性质的 app 并且有内购功能 - 关于内购 最初级的应该是内购的 产品类型 在开发者一开始设置的时候没有注意到区别: 消耗型产品 非消耗型 非 ...

  10. Linux内核--链表结构(二)

    Linux内核链表定义了一系列用于链表遍历的宏,本章详细描述. 一.container_of和offsetof 首先介绍两个很好用的宏container_of和offsetof.offsetof宏用于 ...