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:}
   上面的特殊字体部分是关键词!用在这种删除模式所必须存在的

${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  <==这两行其实是同一行啦!
范例三:我想要删除前面所有的目录,仅保留最后一个目录
[[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
# 嘿!多加了一个 # 变成 ## 之后,他变成『删除掉最长的那个数据』!亦即是:
# /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
# /usr/sbin:/usr/bin:/root/bin  <==这两行其实是同一行啦!

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

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

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

范例四:我想要删除最后面那个目录,亦即从 : 到 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
# 这个部分就容易理解的多了!关键词在于那两个斜线,两斜线中间的是旧字符串
# 后面的是新字符串,所以结果就会出现如上述的特殊字体部分啰!

[[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}
   新的变量,主要用来取代旧变量。新旧变量名称其实常常是一样的

new_var=${old_var-content}
   这是本范例中的关键词部分!必须要存在的哩!

new_var=${old_var-content}
   旧的变量,被测试的项目!

new_var=${old_var-content}
   变量的『内容』,在本范例中,这个部分是在『给予未配置变量的内容』
范例二:若 username 未配置或为空字符串,则将 username 内容配置为 root
[[email protected] ~]# username=""
[[email protected] ~]# username=${username-root}
[[email protected] ~]# echo $username
      <==因为 username 被配置为空字符串了!所以当然还是保留为空字符串!
[[email protected] ~]# username=${username:-root}
[[email protected] ~]# 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) ,然后测试一下减号 (-) 的用法:
[[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?无此变量}
-bash: str: 无此变量    <==因为 str 不存在,所以输出错误信息 

测试:若 str 存在时,则 var 的内容会与 str 相同!
[[email protected] ~]# str="oldvar"; var=${str?novar}
[[email protected] ~]# echo var="$var", str="$str"
var=oldvar, str=oldvar  <==因为 str 存在,所以 var 等于 str 的内容

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 08:20:40

Linux变量内容的删除、取代与替换的相关文章

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

linux是一个多用户多任务的系统,不同于windows的单人多任务操作系统.再linux上,在同一个时间点上,可以有多个人同时执行多个任务. 那么假若有10个用户,同时打开了100个100M的文件.你觉得你的linux能够吃的消吗.你能任由其他的用户肆意的占用你的linux运行内存吗?如果你能忍受,现在你的机子估计已经宕机了.接下来我们来看看如何来限制用户的某些系统资源,包括可以打开的文件数量.可以使用的CPU时间,可以使用的内存总数量,如何设置呢? 试试ulimit吧.这ulimit命令也十

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 <==这两行事实上是同一行啦! 范例二:如果我不

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

变量内容的删除与取代 1)${变量#关键词}:从变量开头开始检索与关键词匹配的数据,将匹配的最短数据删除. 例: [[email protected] abc]# echo $PATH /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [[email protected] abc]# echo ${PATH#*:} /usr/local/sbin:/usr/lo

Shell与shellscript学习笔记之三(变量内容的删除、替代与替换)

1. 变量内容的删除与替换 #代表由前面开始删除,所以这里便由开始的/删起,*来代替0到无穷多个任意字符 %由后面向前删除变量内容 例如:echo ${path%:*bin}删除最有一个目录,即从:到bin为止的字符串并且是最短的 echo ${path/sbin/SBIN}:两个斜线中间的是旧字符,后面的是新字符 变量设置方式 说明 ${变量#关键字} 若变量内容从头开始的数据符合"关键字",则将符合的最短数据删除 ${变量##关键字} 若变量内容从头开始的数据符合"关键字

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

Shell变量的删除: [email protected]:~$ path=${PATH}     ##设置path和PATH相同内容 [email protected]:~$ echo $path /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games [email protected]:~$ echo ${path#/*sbin:}        ##加上'#'符号删除匹

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

[[email protected] log]# var=/dir1/dir2/file.txt 1.对变量取值 [[email protected] log]# echo ${var} /dir1/dir2/file.txt 2.求字符串的长度 [[email protected] log]# echo ${#var} 19 3.提取位置3到最后的字符 [[email protected] log]# echo ${var:3} r1/dir2/file.txt 4.从位置3,开始提取5个字符

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

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

【Shell】变量的取用、删除、取代与替换

——来自<鸟哥的Linux私房菜> ——总结做方便查阅之用 变量的取用: echo echo $variableecho $PATHecho ${PATH} 变量的配置守则1.变量与变量内容以一个等号『=』来连结,如下所示: 『myname=VBird』 2.等号两边不能直接接空格符,如下所示为错误: 『myname = VBird』或『myname=VBird Tsai』 3.变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误: 『2myname=VBird』 4.变量内容若有

Shell变量的取用、删除、取代与替换

<<鸟哥的私房菜>> 变量的取用: echo echo $variableecho $PATHecho ${PATH} 变量的配置守则1.变量与变量内容以一个等号『=』来连结,如下所示:  『myname=VBird』 2.等号两边不能直接接空格符,如下所示为错误:  『myname = VBird』或『myname=VBird Tsai』 3.变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:  『2myname=VBird』 4.变量内容若有空格符可使用双引号『