博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux变量内容的删除、代替与替换
阅读量:6081 次
发布时间:2019-06-20

本文共 5404 字,大约阅读时间需要 18 分钟。

变量内容的删除与代替

范例一:先让小写的 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 $usernameroot       <==由于 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 的内容

转载地址:http://ukkwa.baihongyu.com/

你可能感兴趣的文章
eclipse 不能建立maven项目
查看>>
Session死亡讲解
查看>>
八周三次课(1月31日)
查看>>
我的友情链接
查看>>
关于linux中 变量相关 学习小白总结
查看>>
文德数据启动国庆中秋大优惠——现在购买立省三千
查看>>
每天一个python 小案例——循环和列表
查看>>
结构体/struct
查看>>
用VC++开发Oracle数据库应用程序详解
查看>>
CCS初学那点事(二)
查看>>
机器学习:数据预处理之独热编码(One-Hot)
查看>>
我的友情链接
查看>>
apache之虚拟主机
查看>>
dedeCMS5.7在任意栏目获取顶级栏目名称及链接的方法
查看>>
linux之文本搜索工具(grep、egrep)用法
查看>>
活动目录中组的类型和可用范围
查看>>
子网掩码划分随手记
查看>>
mysqli_fetch_all
查看>>
OpenCL-0-基础概念
查看>>
‘char* maxn(const char**, int)’ does not match any template declaration
查看>>