shell中变量的测试与替换
在某些时刻我们经常需要判断某个变量是否存在,若变量存在则使用既有的设置,若变量不存在则给予一个常用的设置。
(1) 变量未被设置或者内容为空,则替换为新的内容.
new_var=${old_var-content}
范例一:测试一下是否存在 username 这个变量,若不存在则给予 username 内容为 root
[root@www ~]# echo $username
<==由于出现空白,所以 username 可能不存在,也可能是空字符串
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
root <==因为 username 没有设定,所以给予为 root的内容。
[root@www ~]# username="vbird tsai"
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
vbird tsai <==因为 username 已经设定了,所以使用旧有的设定而不以 root取代
上面的范例中,若username已经设定为空串的话,则不会替换,如果要想它进行次替换就可以用加上“:”,即# username=${username:-root}
范例二:若 username 未设定或者为空字符串,则将 username 内容设定为 root
[root@www ~]# username=""
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
<==因为 username 被设定为空字符串了!所以当然还是保留为空字符串!
[root@www ~]# username=${username:-root}
[root@www ~]# echo $username
root <==加上『 : 』后若变量内容为空或者是未设定,都能够以后面的内容替换。
(2) "-"是不影响旧的内容,若想要替换新的内容则用“=”
[root@www ~]# unset str; var=${str=newvar}
[root@www ~]# echo var="$var", str="$str"
var=newvar, str=newvar <==因为 str 不存在,所以 var/str 均为 newvar
测试:如果 str 已存在了,测试一下 var 会发怎样?
[root@www ~]# str="oldvar"; var=${str=newvar}
[root@www ~]# echo var="$var", str="$str"
var=oldvar, str=oldvar <==因为str存在,所以var等于str的内容
(3) 如果我想知道,如果旧变量不存在时,整个测试就告知我『有错误』,此时就能够使用问号
[root@www ~]# unset str; var=${str?无此变量}
-bash: str: 无此发量 <==因为 str 不存在,所以输出错误讯息
(4) 总结
- "-" :新内容的值会赋予没有设定的变量,不会影响已经设定的变量,如旧变量为空字符串,那么新变量仍为空字符串;
- ":-":变量未设定和变量为空字符串将视为同一种情况,新内容的值会直接赋予给变量;旧变量已设定为非空字符串得到情况除外;
- "+":与"-"情况相反,只会影响已经设定的变量,新内容的值会直接赋予给变量;
- ":+":与":-"情况相反,变量未设定和变量为空字符串将视为同一种情况,不会受到影响,旧变量已设定为非空字符串得到情况除外;
- "=":与"-"类似,新内容的值会赋予未设定的变量,同时会覆盖掉旧变量的值;
- ":=":与":-"类似,新内容的值会直接赋予给变量,同时会覆盖掉旧变量的值,旧变量已设定为非空字符串得到情况除外;
- "?":如果我想知道,如果旧变量不存在时,整个测试就告知我『有错误』,此时就能够使用问号;
- ":?":如果我想知道,如果旧变量不存在或被设置为空字符串时,整个测试就告知我『有错误』,此时就能够使用":?"。
| 变量设定方式 | str没有设定 | str为空字符串 | str已设定为非空字符串 |
|---|---|---|---|
| var=${str-expr} | var=expr | var= | var=$str |
| var=${str:-expr} | var=expr | var=expr | var=$str |
| var=${str+expr} | var= | var=expr | var=expr |
| var=${str:+expr} | var= | var= | var=expr |
| var=${str=expr} | str=expr var=expr |
str不变 var= |
str不变 var=$str |
| var=${str:=expr} | str=expr var=expr |
str=expr var=expr |
str不变 var=$str |
| var=${str?expr} | expr输出至stderr | var= expr无输出 |
var=$str expr无输出 |
| var=${str:?expr} | expr输出至stderr | expr输出至stderr | var=$str expr无输出 |
shell中变量的测试与替换的更多相关文章
- 在shell中变量的赋值有五种方法!
转至:https://blog.csdn.net/weibo1230123/article/details/82085226 在shell中变量的赋值有五种 :使用 read 命令,直接赋值,使用命令 ...
- Shell中的条件测试和循环语句
1.条件测试:test或[ 如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为0 运行结果: 带与.或.非的测试命令[ ! EXPR ] : E ...
- shell编程学习笔记(二):Shell中变量的使用
变量在很多编程语言中都有,Shell中也不例外,我们下面看一下Shell中的变量怎么使用: 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/scripts # vi ...
- [SHELL]shell中变量的使用
1.输出变量 : #! /bin/bash my_var=BOB echo $my_var echo "hi,$my_var" echo "the price is \$ ...
- linux学习(八)Shell中变量的数学运算
目录 常见的运算符 expr命令 @(Shell中变量的数学运算) 常见的运算符 环境变量 说明 + 加 - 减 * 乘 / 除 % 取模 因为Shell中将*作为通配符使用, expr命令 expr ...
- Shell中变量的使用
1.变量的声明 name="blacksonny" 注意://变量定义时不加$,变量与等号之间不能有空格 变量命名规则: 首个字符必须为字母(a-z,A-Z). 中间不能有空格,可 ...
- Shell中变量扩展操作
假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值:${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir ...
- shell中变量字符串的截取 与 带颜色字体、背景输出
字符串截取 假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值:${file#*/}:删掉第一个 /及其左边的字符串:dir ...
- shell 中变量前"?"的作用
example: if ($?USER == 0 || $?prompt == 0) then .... if ( $?DS_HOME != 0 ) then if ( ${? ...
随机推荐
- 如何预测 Pinterest 和 Instagram 的未来发展潜力?
作者:陈琪链接:https://www.zhihu.com/question/20169268/answer/14229241来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- BZOJ 4241: 历史研究 ( 回 滚 )
题目: 链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4241 题意:给你一个长度为n序列,m次查询,每次询问 一段区间 最大的 a[ i ...
- rxjs与vue
原创文章,转载请注明出处 使用vue-rx插件将vue和rxjs联系起来 在main.js中将vue-rx注入vue中 import Vue from 'vue' import App from '. ...
- windows下注册表脚本编写
Reg文件就是我今天所说的注册表脚本文件,双击可将其中的数据写入注册表.利用注册表脚本文件可以对注册表进行关于键值的任何操作,而且还不受注册表被禁用的限制. 我们平常对注册表的修改大体上可以分 ...
- 7月清北学堂培训 Day 1
今天是林永迪老师的讲授~ 基础算法 1. 模拟算法 面向测试算法 模拟算法的关键就是将人类语言翻译成机器语言. 要做到以下两点: 1.优秀的读题能力: 2.优秀的代码能力: 程序流程图: 读入,循环处 ...
- 1-7HSB色彩模式
http://www.missyuan.com/thread-350721-1-1.html HSB色彩模式色相hue.饱和度saturation.明度brightness 在HSB模式中,S和B的取 ...
- Selenium调用使用360浏览器,QQ浏览器,遨游浏览器,猎豹浏览器,Chromium
国产的360安全浏览器,360急速浏览器,QQ浏览器,遨游浏览器甚至新版还未上市的Edge浏览器都是基于Chrome浏览器的开源版本Chronium开发来的.所以360浏览器可以理解为一个定制的Chr ...
- pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your path && FileNotFoundError: [WinError 2] 系统找不到指定的文件。
C:\Users\k\Desktop\test>python test.py Traceback (most recent call last): File , in run_tesseract ...
- JavaWeb_(Spring框架)注解配置
系列博文 JavaWeb_(Spring框架)xml配置文件 传送门 JavaWeb_(Spring框架)注解配置 传送门 Spring注解配置 a)导包和约束:基本包.aop包+context约束 ...
- Java连接Memcached进行CRUD
参考这篇博文在本机安装了Memcached 在 Java 中常用的memcached有三个: Memcached Client for Java SpyMemcached XMemcached 这里使 ...