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

最新文章

  1. windows下安装kibana出 "EPERM: operation not permitted
  2. arrayToJson将数组转化为json格式的js代码 ///////////////////////zzzzzzzzzzzzzzzz
  3. JDBC + MySQL 示例
  4. 【转】PCI学习笔记
  5. ReCap 360 photo照片建模技术的又一个例子
  6. VIJOS1240 朴素的网络游戏[DP]
  7. 一个java的DES加密解密类转换成C#
  8. 2016年12月8日 星期四 --出埃及记 Exodus 21:3
  9. 核心ASP.NET
  10. webstom,zencoding,windows快捷键
  11. 201621123040《Java程序设计》第六周学习总结
  12. Impala中的代码生成技术
  13. CentOS 安装git
  14. ubuntu输入法
  15. Microsoft在8月7号发布的帮助文档更新中,HelpLibrary2安装Cab文档包出现签名问题
  16. Java Editplus编译环境配置
  17. 转 Git 常用命令大全
  18. linux 查找文件或者服务
  19. 关于innodb_thread_concurrency参数 并发控制
  20. Linux 下搭建 Svn+Apache

热门文章

  1. 前端性能优化(JavaScript篇)
  2. vue-baidu-map 进入页面自动定位的解决方案!
  3. CCF201409-3 字符串匹配
  4. vConsole移动端调试利器
  5. jboss7学习3-jboss安装 访问(外网)添加用户
  6. FreeRTOS+CubeMX编程实践
  7. 深度剖析text-align家族
  8. 攻防世界-MISC:base64÷4
  9. FreeRTOS --(15)信号量之概述
  10. 面试突击44:volatile 有什么用?