变量内容的删除与代替

范例一:先让小写的 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变量内容的删除、代替与替换的更多相关文章

  1. 常见linux命令释义(第七天)——ulimit 与变量内容的删除替代与替换。

    linux是一个多用户多任务的系统,不同于windows的单人多任务操作系统.再linux上,在同一个时间点上,可以有多个人同时执行多个任务. 那么假若有10个用户,同时打开了100个100M的文件. ...

  2. Linux变量内容的删除、取代与替换

    变量内容的删除与取代 范例一:先让小写的 path 自定义变量配置的与 PATH 内容相同 [root@www ~]# path=${PATH} [root@www ~]# echo $path /u ...

  3. 变量内容的删除、取代与替换 (Optional)

    变量除了可以直接设置来修改原本的内容之外,有没有办法通过简单的动作来将变量的内容进行微调呢? 举例来说,进行变量内容的删除.取代与替换等!是可以的!我们可以通过几个简单的小步骤来进行变量内容的微调喔! ...

  4. 变量内容的删除、取代与替换(optional)

    这部分内容非常繁琐且不易记忆且枯燥,用到来查询即可. 1.变量内容的删除 这一部分比较细枝末节,就不再一一手打了,贴范例图片 #:符合取代文字的最短的一个 ##:符合取代文字的最长的一个 2.变量内容 ...

  5. Linux ${} 变量内容的提取和替换功能等

    [root@localhost log]# var=/dir1/dir2/file.txt 1.对变量取值 [root@localhost log]# echo ${var} /dir1/dir2/f ...

  6. shell ## %% 变量内容的删除、替代和替换

    这个写的很清楚: https://www.cnblogs.com/zhaosunwei/p/6831529.html 自己的理解:以后补充 从前向后删除 # 符合替换字符的“最短的”那个 ## 符合替 ...

  7. shell中变量内容的删除,替代

    删除 ${varname#strMatch} // 在varname中从头匹配strMatch,然后删除从头到第一次匹配到的位置 ${varname##strMatch} // 在varname中从头 ...

  8. 【转】Linux下变量内容删除与替换

    转自:http://www.linuxidc.com/Linux/2015-01/111781.htm 当一个变量被赋予值后,有时会对变量的值进行一些微小的调整,比如删除变量值中特定一部份,或替换掉一 ...

  9. Shell--变量内容的删除、替代与替换

    1. 变量内容的删除与替换 #代表由前面开始删除,所以这里便由开始的/删起,*来代替0到无穷多个任意字符 %由后面向前删除变量内容 例如:echo ${path%:*bin}删除最有一个目录,即从:到 ...

随机推荐

  1. centos 安装 yum apt

    以下地址 http://download.csdn.NET/detail/mimi00x/8081263 执行安装命令 rpm -i rpmforge-release-0.5.3-1.el7.rf.x ...

  2. JAVA连接MYSQL8.0问题

    title: java连接mysql8.0问题 date: 2018-07-08 19:27:38 updated: tags: description: keywords: comments: im ...

  3. Visual Studio 2013 滚动条实现代码缩略图

    启动Visual studio 2013,打开工具->选项   在搜索选项输入,滚动条,英文版大概输入Scroll bar or Scroll 或者:文本编辑器->所有语言->滚动条 ...

  4. xtu数据结构 B. Get Many Persimmon Trees

    B. Get Many Persimmon Trees Time Limit: 1000ms Memory Limit: 30000KB 64-bit integer IO format: %lld  ...

  5. TOJ 2446: Mint

    2446: Mint Time Limit(Common/Java):2000MS/20000MS     Memory Limit:65536KByteTotal Submit: 4         ...

  6. 【UML】UML图的发展和体系结构

    导读:上次给徒弟验收UML的项目,在验收的时候提出了很多问题,徒弟也暴露了一些问题.说好我们一起总结成长的,由于最近的事儿,比较忙,所以现在进行总结.上次会议中说到要用门卫思维去总结这部分的知识点,用 ...

  7. MHA的介绍和测试(一)

    MHA的介绍 MySQL的MHA:MySQL的高级可用性管理器和工具MHA的主要目标是在短(通常为10-30秒)的停机时间内自动化主故障转移和slave升级,不受复制一致性问题的困扰,不需要花费大量的 ...

  8. 算法复习——cdq分治

    题目: Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要 ...

  9. response.setHeader参数、用法的介绍

    response.setHeader 是用来设置返回页面的头 meta 信息, 使用时 response.setHeader( name, contect ); meta是用来在HTML文档中模拟HT ...

  10. K大数查询(bzoj 3110)

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...