变量内容的删除与代替

  1. 范例一:先让小写的 path 自己定义变量配置的与 PATH 内容同样
  2. [root@www ~]# path=${PATH}
  3. [root@www ~]# echo $path
  4. /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
  5. /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦!
  6.  
  7. 范例二:如果我不喜欢 kerberos,所以要将前两个文件夹删除掉,怎样显示?
  8. [root@www ~]# echo ${path#/*kerberos/bin:}
  9. /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

  1. ${variable#/*kerberos/bin:}
  2. 上面的特殊字体部分是关键词!
  3.  
  4. 用在这样的删除模式所必须存在的
  5.  
  6. ${variable#/*kerberos/bin:}
  7. 这就是原本的变量名称。以上面范例二来说,这里就填写 path 这个『变量名称』啦!
  8.  
  9. ${variable#/*kerberos/bin:}
  10. 这是重点。代表『从变量内容的最前面開始向右删除』。且仅删除最短的那个
  11.  
  12. ${variable#/*kerberos/bin:}
  13. 代表要被删除的部分。因为 # 代表由前面開始删除,所以这里便由開始的 / 写起。
  14. 须要注意的是,我们还能够透过通配符 * 来代替 0 到无穷多个随意字符
  15.  
  16. 以上面范例二的结果来看, path 这个变量被删除的内容例如以下所看到的:
  17. /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
  18. /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦!

  1. 范例三:我想要删除前面全部的文件夹,仅保留最后一个文件夹
  2. [root@www ~]# echo ${path#/*:}
  3. /usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:
  4. /root/bin <==这两行事实上是同一行啦!
  5. # 因为一个 # 仅删除掉最短的那个,因此他删除的情况能够用底下的删除线来看:
  6. # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
  7. # /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦。
  8.  
  9. [root@www ~]# echo ${path##/*:}
  10. /root/bin
  11. # 嘿!
  12.  
  13. 多加了一个 # 变成 ## 之后。他变成『删除掉最长的那个数据』。亦即是:
  14. # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
  15. # /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦!

由于在 PATH 这个变量的内容中。每一个文件夹都是以冒号『:』隔开的, 所以要从头删除掉文件夹就是介于斜线 (/) 到冒号 (:) 之间的数据。可是 PATH 中不止一个冒号 (:) 啊。 所以 # 与 ## 就分别代表:



    # :符合代替文字的『最短的』那一个;

    ##:符合代替文字的『最长的』那一个

  1. 范例四:我想要删除最后面那个文件夹,亦即从 : bin 为止的字符串
  2. [root@www ~]# echo ${path%:*bin}
  3. /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
  4. /usr/sbin:/usr/bin <==注意啊。最后面一个文件夹不见去!
  5. # 这个 % 符号代表由最后面開始向前删除!所以上面得到的结果事实上是来自例如以下:
  6. # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
  7. # /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦!
  8.  
  9. 范例五:那假设我仅仅想要保留第一个文件夹呢?
  10. [root@www ~]# echo ${path%%:*bin}
  11. /usr/kerberos/sbin
  12. # 相同的, %% 代表的则是最长的符合字符串,所以结果事实上是来自例如以下:
  13. # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
  14. # /usr/sbin:/usr/bin:/root/bin <==这两行事实上是同一行啦!

  1. 范例六:将 path 的变量内容内的 sbin 代替成大写 SBIN
  2. [root@www ~]# echo ${path/sbin/SBIN}
  3. /usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
  4. /usr/sbin:/usr/bin:/root/bin
  5. # 这个部分就easy理解的多了。关键词在于那两个斜线,两斜线中间的是旧字符串
  6. # 后面的是新字符串。所以结果就会出现如上述的特殊字体部分啰!
  7.  
  8. [root@www ~]# echo ${path//sbin/SBIN}
  9. /usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/SBIN:/usr/local/bin:/SBIN:/bin:
  10. /usr/SBIN:/usr/bin:/root/bin
  11. # 假设是两条斜线,那么就变成全部符合的内容都会被代替喔。

总结

变量配置方式 说明
${变量#关键词}

${
变量##关键词}
若变量内容从头開始的数据符合『关键词』,则将符合的最短数据删除

若变量内容从头開始的数据符合『关键词』,则将符合的最长数据删除
${变量%关键词}

${
变量%%关键词}
若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除

若变量内容从尾向前的数据符合『关键词』。则将符合的最长数据删除
${变量/旧字符串/新字符串}

${
变量//旧字符串/新字符串}
若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串代替』

若变量内容符合『旧字符串』则『所有的旧字符串会被新字符串代替』

变量的測试与内容替换

在某些时刻我们经常须要『推断』某个变量是否存在,若变量存在则使用既有的配置,若变量不存在则给予一个经常使用的配置。

  1. 范例一:測试一下是否存在 username 这个变量。若不存在则给予 username 内容为 root
  2. [root@www ~]# echo $username
  3. <==由于出现空白,所以 username 可能不存在。也可能是空字符串
  4. [root@www ~]# username=${username-root}
  5. [root@www ~]# echo $username
  6. root <==由于 username 没有配置,所以主动给予名为 root 的内容。
  7.  
  8. [root@www ~]# username="vbird tsai" <==主动配置 username 的内容
  9. [root@www ~]# username=${username-root}
  10. [root@www ~]# echo $username
  11. vbird tsai <==由于 username 已经配置了,所以使用旧有的配置而不以 root 代替

  1. new_var=${old_var-content}
  2. 新的变量,主要用来代替旧变量。
  3.  
  4. 新旧变量名称事实上经常是一样的
  5.  
  6. new_var=${old_var-content}
  7. 这是本范例中的关键词部分!必需要存在的哩!
  8.  
  9. new_var=${old_var-content}
  10. 旧的变量。被測试的项目!
  11.  
  12. new_var=${old_var-content}
  13. 变量的『内容』,在本范例中。这个部分是在『给予未配置变量的内容』

  1. 范例二:若 username 未配置或为空字符串。则将 username 内容配置为 root
  2. [root@www ~]# username=""
  3. [root@www ~]# username=${username-root}
  4. [root@www ~]# echo $username
  5. <==由于 username 被配置为空字符串了!
  6.  
  7. 所以当然还是保留为空字符串。
  8. [root@www ~]# username=${username:-root}
  9. [root@www ~]# echo $username
  10. 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
  1. 測试:先如果 str 不存在 (用 unset) ,然后測试一下减号 (-) 的使用方法:
  2. [root@www ~]# unset str; var=${str-newvar}
  3. [root@www ~]# echo var="$var", str="$str"
  4. var=newvar, str= <==由于 str 不存在。所以 var newvar
  5.  
  6. 測试:若 str 已存在,測试一下 var 会变如何?:
  7. [root@www ~]# str="oldvar"; var=${str-newvar}
  8. [root@www ~]# echo var="$var", str="$str"
  9. var=oldvar, str=oldvar <==由于 str 存在,所以 var 等于 str 的内容

  1. 測试:先如果 str 不存在 (用 unset) ,然后測试一下等号 (=) 的使用方法:
  2. [root@www ~]# unset str; var=${str=newvar}
  3. [root@www ~]# echo var="$var", str="$str"
  4. var=newvar, str=newvar <==由于 str 不存在,所以 var/str 均为 newvar
  5.  
  6. 測试:如果 str 已存在了。測试一下 var 会变如何?
  7. [root@www ~]# str="oldvar"; var=${str=newvar}
  8. [root@www ~]# echo var="$var", str="$str"
  9. var=oldvar, str=oldvar <==由于 str 存在,所以 var 等于 str 的内容

  1. 測试:若 str 不存在时。则 var 的測试结果直接显示 "无此变量"
  2. [root@www ~]# unset str; var=${str?
  3.  
  4. 无此变量}
  5. -bash: str: 无此变量 <==由于 str 不存在,所以输出错误信息
  6.  
  7. 測试:若 str 存在时,则 var 的内容会与 str 同样!
  8. [root@www ~]# str="oldvar"; var=${str?novar}
  9. [root@www ~]# echo var="$var", str="$str"
  10. 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. python基础学习笔记——shelve、shutil模块

    shelve 我们之前学了json和pickle模块 这些都是序列化的模块,咱们进行在讲一个序列化的东西 叫做shelve 你们肯定有个疑问,这个东西和那个类似为什么要讲.是因为这个模块比较简单的,并 ...

  2. 在web中绘制图像 -- canvas篇

    汗,不小心点击发布了.其实正在编辑中...... HTML Canvas是现代浏览器中非常棒的绘图技术,Canvas可以绘制图形,操作图片,制作游戏,创建动画等:Canvas是很容易使用的,下面我们来 ...

  3. 四丶人生苦短,我用python【第四篇】

    1 基本数据类型 数字    int 字符串   str 布尔值   bool 列表       list 元组       tuple 字典       dict >>>type( ...

  4. liunx 根目录介绍

    1. /bin binary二进制 存放系统许多可执行程序文件 执行的相关指令,例如ls pwd whoami,后台的支持文件目录 2. /sbin super binary超级的二进制 存放系统许多 ...

  5. 【原】缓存之 HttpRuntime.Cache

    1.HttpRuntime.Cache HttpRuntime.Cache 相当于就是一个缓存具体实现类,这个类虽然被放在了 System.Web 命名空间下了.但是非 Web 应用也是可以拿来用的. ...

  6. XML文件中<return_code><![CDATA[SUCCESS]]></return_code>中CDATA的用法

    转义字符不合法的XML字符必须被替换为相应的实体. 如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始.所以不应该象下面 ...

  7. hdu6060[贪心+dfs] 2017多校3

    /* hdu6060[贪心+dfs] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long L ...

  8. 如何解决 错误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' 大家在做真机调试的时候,或许会遇到这样的问题,那如何 ...

  9. BZOJ 2190 [SDOI2008]仪仗队 ——Dirichlet积

    [题目分析] 考虑斜率为0和斜率不存在的两条线上只能看到3人. 其余的人能被看见,当且仅当gcd(x,y)=1 ,然后拿卷积算一算 发现就是欧拉函数的前缀和的二倍. 注意2的情况要特判. [代码] # ...

  10. spring之Autowire

    当使用spring为一个对象的属性注入时,通常使用xml文件的property元素和ref属性,但是我们也可以使用spring中的autowire进行注入 使用方法如下 <bean id=&qu ...