『忘了再学』Shell基础 — 21、变量的测试与内容置换
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、变量的测试与内容置换的更多相关文章
- 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)
提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...
- 『忘了再学』Shell基础 — 16、位置参数变量
目录 1.位置参数变量$n 2.位置参数变量$*和$@ 3.位置参数变量$# 位置參数变量的作用主要用于脚本的传参. 位置參数变量的名称和作用都是确定不能改变的,但是该变量的内容是可以更改的,也就是变 ...
- 『忘了再学』Shell基础 — 20、Shell中的运算符
目录 1.Shell常用运算符 2.Shell中数值运算的方法 (1)方式一 (2)方式二 (3)方式三(推荐) 1.Shell常用运算符 Shell中常用运算符如下表: 优先级数值越大优先级越高,具 ...
- 『忘了再学』Shell基础 — 17、预定义变量
目录 1.预定义变量$? 2.预定义变量$$和$! 我们之前说过,Shell中的变量不是按照变量值的类型来进行分类的,而是按照Linux系统中定义的变量类别来分类的. 预定义变量就是,事先把变量的名称 ...
- 『忘了再学』Shell基础 — 19、使用declare命令声明变量类型
目录 1.declare命令介绍 2.声明数组变量类型 3.声明变量为环境变量 4.声明只读属性 5.补充: 1.declare命令介绍 Shell中所有变量的默认类型是字符串类型,如果你需要进行特殊 ...
- 『忘了再学』Shell基础 — 3、echo命令的介绍与使用
目录 1.echo命令的作用 2.echo命令的基本用法 3.echo命令的-e选项用法 4.echo命令一些特殊用法 (1)输出字符带有字体颜色 (2)输出字符带有背景颜色 在讲Shell脚本之前, ...
- 『忘了再学』Shell基础 — 24、Shell正则表达式的使用
目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...
- 『忘了再学』Shell基础 — 25、扩展正则表达式
目录 1.扩展正则表达式说明 2.练习 (1)+和?练习 (2)|和()练习 3.注意(重点) 1.扩展正则表达式说明 熟悉正则表达式的童鞋应该很疑惑,在其他的语言中是没有扩展正则表达式说法的,在Sh ...
- 『忘了再学』Shell基础 — 30、sed命令的使用
目录 1.sed命令说明 2.行数据操作 (1)查看文件中的数据 (2)删除文件中的数据 (3)向文件中追加数据 (4)向文件中插入数据 (5)修改文件中的多行数据(删除,追加,插入) (6)替换文件 ...
随机推荐
- token的工作原理及其功能
一.前言 登录模块是我们在前端项目中一定会有的模块,模块中有一个重要的部分是用户登录验证,对于验证用户是否登录过,我们直接处理办法是检查缓存中是否存在token值,若存在则用户可直接登录,反之,用户需 ...
- 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
问题描述:在使用python爬取斗鱼直播的数据时,使用str(读取到的字节,编码格式)进行解码时报错:'utf-8' codec can't decode byte 0x8b in position ...
- 在react项目中使用redux-thunk,react-redux,redux;使用总结
先看是什么,再看怎么用: redux-thunk是一个redux的中间件,用来处理redux中的复杂逻辑,比如异步请求: redux-thunk中间件可以让action创建函数先不返回一个action ...
- LeetCode刷题知识点总结——二叉树
二叉树 一.二叉树理论基础 1.满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树.通俗话理解:从底层开始到顶部的所有节点都全部填满的二叉树.深 ...
- Java学习——数组的基础知识
数组的特点.分类:一维.二维数组的使用:数组的声明和初始化.调用数组的指定位置的元素.获取数组的长度.遍历数组.数组元素的默认初始化值
- print,printf,println的区别,以及\r,\n,\r\n的区别
1.常用的是println,就是换行输出 2.print,不换行输出 3.printf常使用于格式转化 public class Print { public static void main(Str ...
- 3天时间从零到上架AppStore流程记录
3天时间从零到上架AppStore流程记录 清明假期刚过去一周,我如愿以偿把自己想要的一个App上架了AppStore 从有idea到技术选型,从设计稿到框架开发,从提审AppStore到上架一共经历 ...
- ES Bridge跨链桥服务升级,新增BSC跨链网络
3月15日,Equal Sign Bridge(ES Bridge)跨链桥宣布新增BSC跨链网络,方便更多用户参与到ES Bridge的建设与发展,未来还将持续拓展更多的主流跨链币种,提升各链间的互操 ...
- 2022.02.20 SA
2022.02.20 SA 如果我还能看见明天黎明,如果我还能再爬起来,我仍会走我的路,哪怕这条路已经荒废许久,也许我们无法拥有感情,我们甚至无法像个正常人一样接受太阳的洗礼,但是我依然会执行我的条约 ...
- 一文学会text-justify,orientation,combine文本属性
大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...