在脚本中,有时需要判断变量是否存在或是否被赋予了值,如果变量已经存在并且被赋予了值,则不改变变量;如果变量不存在或没有被赋值,则赋予其新值。这时我们就可以使用变量测试与内容置换。

我们在脚本中可以使用条件判断语句 if 来替代这种测试方法,不过使用 Shell 自带的变量置换更加方便,但是这种方法容易记混,我们通过表 1 来进行说明。

表 1 变量测试与内容置换

变量置换方式

变量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= 新值

x 为空

x=$y

y= 新值

y 值不变

y值不变

x=${y:=新值}

x= 新值

X= 新值

x=$y

y= 新值

y= 新值

y值不变

x=${y?新值}

新值输出到标准错误输出(屏幕)

x 为空

x=$y

x=${y:?新值}

新值输出到标准错误输出

新值输出到标准错误输出

x=$y

如果大括号内没有":",则变量 y 为空或没有被设置,处理方法是不同的;如果大括号内有":",则变量 y 不论是为空,还是没有被设置,处理方法是一样的。

如果大括号内是"-"或"+",则在改变变量 x 的值的时候,变量 y 的值是不改变的;如果大括号内是"=",则在改变变量 x 的值的同时,变量 y 的值也会改变。

如果大括号内是"?",则当变量 y 不存在或为空时,会把"新值"当成报错输出到屏幕上。

【例 1】

[root@localhost ~]# unset y

#删除变量y

[root@localhost ~]# x=${y-new}

#进行测试

[root@localhost ~]# echo $x

new

#因为变量y不存在,所以x=new

[root@localhost ~]# echo $y

#变量y还是不存在的

和表 1 对比一下,是不是可以看懂了?这是变量 y 不存在的情况,如果变量 y 为空呢?

[root@localhost ~]#y=""

#给变量y赋值为空

[root@localhost ~]#x=${y-new}

#进行测试

[root@localhost ~]# echo $x

[root@localhost ~]# echo $y

#变量x和y都为空

如果变量y有值呢?

[root@localhost ~]#y=old

#给变量y赋值

[root@localhost ~]# x=${y-new}

#进行测试

[root@localhost ~]# echo $x

old

[root@localhost ~]# echo $y

old

#变量x和y的值都是old

【例2】

如果大括号内是"=",则又是什么情况呢?先测试一下变量 y 没有被设置的情况,如下:

[root@localhost ~]# unset y

#删除变量y

[root@localhost ~]# x=${y:=new}

#进行测试

[root@localhost ~]# echo $x

new

[root@localhost ~]# echo $y

new

#变量x和y的值都是new

一旦使用了"=",那么会同时处理变量 x 和 y,而不像例 1 那样只改变变量 x 的值。如果变量 y 为空,则又是什么情况呢?

[root@localhost ~]#y=""

#设定变量y为空

[root@localhost ~]#x=${y:=new}

#进行测试

[root@localhost ~]# echo $x

new

[root@localhost ~]# echo $y

new

#变量x和y的值都是new

一旦在大括号中使用":",那么变量 y 为空或者没有被设置,处理方法是一样的。如果变量 y 已经被赋值 了,则又是什么情况?

[root@localhost ~]# y=old

#给变量y赋值

[root@localhost ~]#x=${y:=new}

#进行测试

[root@localhost ~]# echo $x

old

[root@localhost ~]# echo $y

old

#变量x和y的值都是old

【例3】

再测试一下大括号中是"?"的情况。

[root@localhost ~]# unset y

#删除变量y

[root@localhost ~]#x=${y?new}

-bash: y: new

#会把值"new"输出到屏幕上

如果变量 y 已经被赋值了呢?

[root@localhost ~]# y=old

#给变量y赋值

[root@@localhost ~]# x=${y?new}

#进行测试

[root@localhost ~]# echo $x

old

[root@localhost ~]# echo $y

old

#变量x和y的值都是old

这些内容实在让人头疼啊,如果在脚本中用到了,则参考表 1 即可。

变量置换方式linux,Shell变量测试与内容置换相关推荐

  1. linux shell变量的,linux shell变量解析

    摘要 腾兴网为您分享:linux shell变量解析,智影,智联招聘,智慧消防,音恋等软件知识,以及考拉fm电台,快快游戏,京东企业购app,pdf加密工具,高德导航3d版,电脑驱动,兰溪新闻,我爱网 ...

  2. Linux shell 变量 数学 运算

    出处:http://qujunorz.blog.51cto.com/6378776/1382085 Abstract : 1)  Linux shell 中使用 let , [ ] ,(( )) 三种 ...

  3. Linux Shell变量使用

    一.本地变量的使用 本地变量就如同局部变量一样,只在本SHELL中起作用.它不会影响到其他SHELL中的变量. 1.显示变量值 可以使用echo命令.需要注意的是,使用变量的时候必须在变量名前加上$符 ...

  4. Linux Shell变量类型

    Linux Shell 变量的类型 自定义变量类型 定义变量: 变量名=变量值 变量名必须以字母或者下划线开头,区分大小写 引用变量: 变量名或者变量名 或者变量名或者(变量名) 查看变量: echo ...

  5. 【Linux】Shell三类变量的作用域——linux shell “永久环境变量”、“临时环境变量”和普通变量之完全解读...

    2015-05-08 00:15 3896人阅读 评论(10) 收藏 举报 本文章已收录于: 分类: 软件开发进阶(419) 作者同类文章X Unix/Linux杂项(118) 作者同类文章X 版权声 ...

  6. linux shell 变量减法_Linux Shell (3) - 变量运算

    Linux Shell (3) - 变量运算 String - expr命令 concat str=$str1$str2 str=$str1' '$str2 str=$str'12345 '$str2 ...

  7. 《Linux shell变量总结回顾》RHEL6

    在实际的生产中,运维一般使用的shell语法还是比较多的,时不时的就要写一个简短shell脚本,大型的shell脚本用到的function 比较多,便于下一个脚本的引入,下面主要总结一些简单的shel ...

  8. linux shell 变量减法_第四章 shell和环境变量

    第四章 shell和环境变量 4.1    shell简介 4.1.1 编译器 一台计算机从基本架构上讲,由最基本的硬件组成硬件结构(如:cpu.内存.主板.声卡.显卡等),我们知道,硬件组成完备,但 ...

  9. linux shell 变量 管道,linux下shell,变量,管道,重定向等基础知识及技巧

    知识点如下: 1,关于shell编程中的变量,shell编程中的变量分为4种 本地变量:只对本系统本用户自己的shell有用 环境变量:对本系统的所有shell都有用  用export来声明变量  例 ...

最新文章

  1. Lombok 的爱恨情仇
  2. CTFshow 文件上传 web157
  3. MVC4 WebAPI
  4. iGraph(Python)报错sh:open command not found的解决
  5. 荣耀系列到底算不算华为手机
  6. 大数据技术在网络安全分析的作用
  7. java声明接口_为什么必须用Java声明接口?
  8. SPP Net(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)论文理解...
  9. spring3.0注解定时任务配置及说明
  10. 完美解决Win8声卡爆音破音、卡顿
  11. linux shell mysql版本,Linux中Shell操作MySQL
  12. 【2022 年“SPSSPRO 杯”数学中国数学建模网络挑战赛】A题 人员的紧急疏散-第二阶段23页论文
  13. 泰坦尼克号python数据分析统计服_数据分析可视化——泰坦尼克号幸存者分析(上)...
  14. IT66021FN 寄存器配置
  15. 2021-06-24CTF-攻防世界-WEB新手练习区(12题入门题)
  16. HDI(高密度互联)PCB板
  17. 大数据------维度表,事实表
  18. CS5266 Type-c转HDMI4K30HZ
  19. 原画还是3D建模?业内发展趋势,你来权衡
  20. 《商用密码应用与安全性评估》第二章政策法规2.1网络空间安全形式与商业密码工作

热门文章

  1. 爱上MVC~ajax调用分部视图session超时页面跳转问题
  2. 基于SharePoint 2013的论坛解决方案[开源]
  3. mysql C语言API接口及实例
  4. Mysql 的源码包安装
  5. 〖Android〗代理与正常网络分开同步CyangenMod源码
  6. php中四种webservice实现的简单架构方法及实例
  7. 云服务器ecs的特点有什么
  8. 高防御服务器与高防御IP之间的关系
  9. 成都服务器怎么租用最便宜—Vecloud
  10. SDN的实现方式及局限性—Vecloud微云