变量内容的删除与代替
- 范例一:先让小写的 path 自己定义变量配置的与 PATH 内容同样
- [root@www ~]# path=${PATH}
- [root@www ~]# echo $path
- /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
- /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦!
-
- 范例二:如果我不喜欢 kerberos,所以要将前两个文件夹删除掉,怎样显示?
- [root@www ~]# echo ${path#/*kerberos/bin:}
- /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
|
- ${variable#/*kerberos/bin:}
- 上面的特殊字体部分是关键词!
-
- 用在这样的删除模式所必须存在的
-
- ${variable#/*kerberos/bin:}
- 这就是原本的变量名称。以上面范例二来说,这里就填写 path 这个『变量名称』啦!
-
- ${variable#/*kerberos/bin:}
- 这是重点。代表『从变量内容的最前面開始向右删除』。且仅删除最短的那个
-
- ${variable#/*kerberos/bin:}
- 代表要被删除的部分。因为 # 代表由前面開始删除,所以这里便由開始的 / 写起。
- 须要注意的是,我们还能够透过通配符 * 来代替 0 到无穷多个随意字符
-
- 以上面范例二的结果来看, path 这个变量被删除的内容例如以下所看到的:
- /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
- /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦!
|
- 范例三:我想要删除前面全部的文件夹,仅保留最后一个文件夹
- [root@www ~]# echo ${path#/*:}
- /usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:
- /root/bin <==这两行事实上是同一行啦!
- # 因为一个 # 仅删除掉最短的那个,因此他删除的情况能够用底下的删除线来看:
- # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
- # /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦。
-
- [root@www ~]# echo ${path##/*:}
- /root/bin
- # 嘿!
-
- 多加了一个 # 变成 ## 之后。他变成『删除掉最长的那个数据』。亦即是:
- # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
- # /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦!
|
由于在 PATH 这个变量的内容中。每一个文件夹都是以冒号『:』隔开的, 所以要从头删除掉文件夹就是介于斜线 (/) 到冒号 (:) 之间的数据。可是 PATH 中不止一个冒号 (:) 啊。 所以 # 与 ## 就分别代表:
# :符合代替文字的『最短的』那一个;
##:符合代替文字的『最长的』那一个
- 范例四:我想要删除最后面那个文件夹,亦即从 : 到 bin 为止的字符串
- [root@www ~]# echo ${path%:*bin}
- /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
- /usr/sbin:/usr/bin <==注意啊。最后面一个文件夹不见去!
- # 这个 % 符号代表由最后面開始向前删除!所以上面得到的结果事实上是来自例如以下:
- # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
- # /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦!
-
- 范例五:那假设我仅仅想要保留第一个文件夹呢?
- [root@www ~]# echo ${path%%:*bin}
- /usr/kerberos/sbin
- # 相同的, %% 代表的则是最长的符合字符串,所以结果事实上是来自例如以下:
- # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
- # /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦!
|
- 范例六:将 path 的变量内容内的 sbin 代替成大写 SBIN:
- [root@www ~]# echo ${path/sbin/SBIN}
- /usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
- /usr/sbin:/usr/bin:/root/bin
- # 这个部分就easy理解的多了。关键词在于那两个斜线,两斜线中间的是旧字符串
- # 后面的是新字符串。所以结果就会出现如上述的特殊字体部分啰!
-
- [root@www ~]# echo ${path//sbin/SBIN}
- /usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/SBIN:/usr/local/bin:/SBIN:/bin:
- /usr/SBIN:/usr/bin:/root/bin
- # 假设是两条斜线,那么就变成全部符合的内容都会被代替喔。
|
总结
变量配置方式 |
说明 |
${变量#关键词}
${变量##关键词} |
若变量内容从头開始的数据符合『关键词』,则将符合的最短数据删除
若变量内容从头開始的数据符合『关键词』,则将符合的最长数据删除 |
${变量%关键词}
${变量%%关键词} |
若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除
若变量内容从尾向前的数据符合『关键词』。则将符合的最长数据删除 |
${变量/旧字符串/新字符串}
${变量//旧字符串/新字符串} |
若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串代替』
若变量内容符合『旧字符串』则『所有的旧字符串会被新字符串代替』
|
变量的測试与内容替换
在某些时刻我们经常须要『推断』某个变量是否存在,若变量存在则使用既有的配置,若变量不存在则给予一个经常使用的配置。
- 范例一:測试一下是否存在 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" <==主动配置 username 的内容
- [root@www ~]# username=${username-root}
- [root@www ~]# echo $username
- vbird tsai <==由于 username 已经配置了,所以使用旧有的配置而不以 root 代替
|
- new_var=${old_var-content}
- 新的变量,主要用来代替旧变量。
-
- 新旧变量名称事实上经常是一样的
-
- new_var=${old_var-content}
- 这是本范例中的关键词部分!必需要存在的哩!
-
- new_var=${old_var-content}
- 旧的变量。被測试的项目!
-
- new_var=${old_var-content}
- 变量的『内容』,在本范例中。这个部分是在『给予未配置变量的内容』
|
- 范例二:若 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 <==加上『 : 』后若变量内容为空或者是未配置。都可以以后面的内容替换!
|
在大括号内有没有冒号『 : 』的区别是非常大的!加上冒号后,被測试的变量未被配置或者是已被配置为空字符串时, 都可以用后面的内容 (本例中是使用 root 为内容) 来替换与配置!
这样可以了解了吗?除了这种測试之外, 还有其它的測试方法。
变量配置方式 |
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= |
var=$str |
var=${str:?expr} |
expr 输出至 stderr |
expr 输出至 stderr |
var=$str
|
- 測试:先如果 str 不存在 (用 unset) ,然后測试一下减号 (-) 的使用方法:
- [root@www ~]# unset str; var=${str-newvar}
- [root@www ~]# echo var="$var", str="$str"
- var=newvar, str= <==由于 str 不存在。所以 var 为 newvar
-
- 測试:若 str 已存在,測试一下 var 会变如何?:
- [root@www ~]# str="oldvar"; var=${str-newvar}
- [root@www ~]# echo var="$var", str="$str"
- var=oldvar, str=oldvar <==由于 str 存在,所以 var 等于 str 的内容
|
- 測试:先如果 str 不存在 (用 unset) ,然后測试一下等号 (=) 的使用方法:
- [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 的内容
|
- 測试:若 str 不存在时。则 var 的測试结果直接显示 "无此变量"
- [root@www ~]# unset str; var=${str?
-
- 无此变量}
- -bash: str: 无此变量 <==由于 str 不存在,所以输出错误信息
-
- 測试:若 str 存在时,则 var 的内容会与 str 同样!
- [root@www ~]# str="oldvar"; var=${str?novar}
- [root@www ~]# echo var="$var", str="$str"
- var=oldvar, str=oldvar <==由于 str 存在,所以 var 等于 str 的内容
|
- 常见linux命令释义(第七天)——ulimit 与变量内容的删除替代与替换。
linux是一个多用户多任务的系统,不同于windows的单人多任务操作系统.再linux上,在同一个时间点上,可以有多个人同时执行多个任务. 那么假若有10个用户,同时打开了100个100M的文件. ...
- Linux变量内容的删除、取代与替换
变量内容的删除与取代 范例一:先让小写的 path 自定义变量配置的与 PATH 内容相同 [root@www ~]# path=${PATH} [root@www ~]# echo $path /u ...
- 变量内容的删除、取代与替换 (Optional)
变量除了可以直接设置来修改原本的内容之外,有没有办法通过简单的动作来将变量的内容进行微调呢? 举例来说,进行变量内容的删除.取代与替换等!是可以的!我们可以通过几个简单的小步骤来进行变量内容的微调喔! ...
- 变量内容的删除、取代与替换(optional)
这部分内容非常繁琐且不易记忆且枯燥,用到来查询即可. 1.变量内容的删除 这一部分比较细枝末节,就不再一一手打了,贴范例图片 #:符合取代文字的最短的一个 ##:符合取代文字的最长的一个 2.变量内容 ...
- Linux ${} 变量内容的提取和替换功能等
[root@localhost log]# var=/dir1/dir2/file.txt 1.对变量取值 [root@localhost log]# echo ${var} /dir1/dir2/f ...
- shell ## %% 变量内容的删除、替代和替换
这个写的很清楚: https://www.cnblogs.com/zhaosunwei/p/6831529.html 自己的理解:以后补充 从前向后删除 # 符合替换字符的“最短的”那个 ## 符合替 ...
- shell中变量内容的删除,替代
删除 ${varname#strMatch} // 在varname中从头匹配strMatch,然后删除从头到第一次匹配到的位置 ${varname##strMatch} // 在varname中从头 ...
- 【转】Linux下变量内容删除与替换
转自:http://www.linuxidc.com/Linux/2015-01/111781.htm 当一个变量被赋予值后,有时会对变量的值进行一些微小的调整,比如删除变量值中特定一部份,或替换掉一 ...
- Shell--变量内容的删除、替代与替换
1. 变量内容的删除与替换 #代表由前面开始删除,所以这里便由开始的/删起,*来代替0到无穷多个任意字符 %由后面向前删除变量内容 例如:echo ${path%:*bin}删除最有一个目录,即从:到 ...
随机推荐
- python基础学习笔记——shelve、shutil模块
shelve 我们之前学了json和pickle模块 这些都是序列化的模块,咱们进行在讲一个序列化的东西 叫做shelve 你们肯定有个疑问,这个东西和那个类似为什么要讲.是因为这个模块比较简单的,并 ...
- 在web中绘制图像 -- canvas篇
汗,不小心点击发布了.其实正在编辑中...... HTML Canvas是现代浏览器中非常棒的绘图技术,Canvas可以绘制图形,操作图片,制作游戏,创建动画等:Canvas是很容易使用的,下面我们来 ...
- 四丶人生苦短,我用python【第四篇】
1 基本数据类型 数字 int 字符串 str 布尔值 bool 列表 list 元组 tuple 字典 dict >>>type( ...
- liunx 根目录介绍
1. /bin binary二进制 存放系统许多可执行程序文件 执行的相关指令,例如ls pwd whoami,后台的支持文件目录 2. /sbin super binary超级的二进制 存放系统许多 ...
- 【原】缓存之 HttpRuntime.Cache
1.HttpRuntime.Cache HttpRuntime.Cache 相当于就是一个缓存具体实现类,这个类虽然被放在了 System.Web 命名空间下了.但是非 Web 应用也是可以拿来用的. ...
- XML文件中<return_code><![CDATA[SUCCESS]]></return_code>中CDATA的用法
转义字符不合法的XML字符必须被替换为相应的实体. 如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始.所以不应该象下面 ...
- hdu6060[贪心+dfs] 2017多校3
/* hdu6060[贪心+dfs] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long L ...
- 如何解决 错误code signing is required for product type 'xxxxx' in SDK 'iOS 8.2'
如何解决 错误code signing is required for product type 'xxxxx' in SDK 'iOS 8.2' 大家在做真机调试的时候,或许会遇到这样的问题,那如何 ...
- BZOJ 2190 [SDOI2008]仪仗队 ——Dirichlet积
[题目分析] 考虑斜率为0和斜率不存在的两条线上只能看到3人. 其余的人能被看见,当且仅当gcd(x,y)=1 ,然后拿卷积算一算 发现就是欧拉函数的前缀和的二倍. 注意2的情况要特判. [代码] # ...
- spring之Autowire
当使用spring为一个对象的属性注入时,通常使用xml文件的property元素和ref属性,但是我们也可以使用spring中的autowire进行注入 使用方法如下 <bean id=&qu ...