Linux变量内容的删除代替与替换
Posted jhcelue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux变量内容的删除代替与替换相关的知识,希望对你有一定的参考价值。
变量内容的删除与代替
范例一:先让小写的 path 自己定义变量配置的与 PATH 内容同样 [[email protected] ~]# path=${PATH} [[email protected] ~]# echo $path /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin: /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦! 范例二:如果我不喜欢 kerberos,所以要将前两个文件夹删除掉,怎样显示? [[email protected] ~]# echo ${path#/*kerberos/bin:} /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin |
${variable#/*kerberos/bin:} 上面的特殊字体部分是关键词! |
范例三:我想要删除前面全部的文件夹,仅保留最后一个文件夹 [[email protected] ~]# 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 <==这两行事实上是同一行啦。 [[email protected] ~]# echo ${path##/*:} /root/bin # 嘿! |
# :符合代替文字的『最短的』那一个;
##:符合代替文字的『最长的』那一个
范例四:我想要删除最后面那个文件夹,亦即从 : 到 bin 为止的字符串 [[email protected] ~]# 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 <==这两行事实上是同一行啦! 范例五:那假设我仅仅想要保留第一个文件夹呢? [[email protected] ~]# 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: [[email protected] ~]# 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理解的多了。关键词在于那两个斜线,两斜线中间的是旧字符串 # 后面的是新字符串。所以结果就会出现如上述的特殊字体部分啰! [[email protected] ~]# 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 [[email protected] ~]# echo $username <==由于出现空白,所以 username 可能不存在。也可能是空字符串 [[email protected] ~]# username=${username-root} [[email protected] ~]# echo $username root <==由于 username 没有配置,所以主动给予名为 root 的内容。 [[email protected] ~]# username="vbird tsai" <==主动配置 username 的内容 [[email protected] ~]# username=${username-root} [[email protected] ~]# echo $username vbird tsai <==由于 username 已经配置了,所以使用旧有的配置而不以 root 代替 |
new_var=${old_var-content} 新的变量,主要用来代替旧变量。 |
范例二:若 username 未配置或为空字符串。则将 username 内容配置为 root [[email protected] ~]# username="" [[email protected] ~]# username=${username-root} [[email protected] ~]# echo $username <==由于 username 被配置为空字符串了! |
这样可以了解了吗?除了这种測试之外, 还有其它的測试方法。
变量配置方式 | 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) ,然后測试一下减号 (-) 的使用方法: [[email protected] ~]# unset str; var=${str-newvar} [[email protected] ~]# echo var="$var", str="$str" var=newvar, str= <==由于 str 不存在。所以 var 为 newvar 測试:若 str 已存在,測试一下 var 会变如何?: [[email protected] ~]# str="oldvar"; var=${str-newvar} [[email protected] ~]# echo var="$var", str="$str" var=oldvar, str=oldvar <==由于 str 存在,所以 var 等于 str 的内容 |
測试:先如果 str 不存在 (用 unset) ,然后測试一下等号 (=) 的使用方法: [[email protected] ~]# unset str; var=${str=newvar} [[email protected] ~]# echo var="$var", str="$str" var=newvar, str=newvar <==由于 str 不存在,所以 var/str 均为 newvar 測试:如果 str 已存在了。測试一下 var 会变如何? [[email protected] ~]# str="oldvar"; var=${str=newvar} [[email protected] ~]# echo var="$var", str="$str" var=oldvar, str=oldvar <==由于 str 存在,所以 var 等于 str 的内容 |
測试:若 str 不存在时。则 var 的測试结果直接显示 "无此变量" [[email protected] ~]# unset str; var=${str? |
以上是关于Linux变量内容的删除代替与替换的主要内容,如果未能解决你的问题,请参考以下文章