设为首页 收藏本站
查看: 894|回复: 0

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

[复制链接]

尚未签到

发表于 2015-12-4 08:53:36 | 显示全部楼层 |阅读模式
  ——来自《鸟哥的Linux私房菜》
  ——总结做方便查阅之用
  变量的取用: echo
  echo $variable
echo $PATH
echo ${PATH}
  变量的配置守则
1.变量与变量内容以一个等号『=』来连结,如下所示:
  『myname=VBird』
  2.等号两边不能直接接空格符,如下所示为错误:
  『myname = VBird』或『myname=VBird Tsai』
  3.变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
  『2myname=VBird』
  4.变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
  『var="lang is $LANG"』则可得『lang is en_US』
单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
  『var='lang is \$LANG‘』则得『lang is \$LANG』
  5.可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;
  6.在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
  『version=\$(uname -r)』再『echo \$version』可得『2.6.18-128.el5』
  7.若该变量为扩增变量内容时,则可用"\$变量"或\${变量} 累加内容,如下所示:
  『PATH="$PATH":/home/bin』
  PS.我一般用\${变量},在变量拼接的时候尤其重要,name=\$nameyes,name的内容是\$nameyes 这个变量;name=\${name}yes,可以把\$name和yes拼接起来
  8.若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:
  『export PATH』
  9.通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;
  10.取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:
  『unset myname』
  
  变量内容的删除、取代与替换
  范例一:先让小写的 path 自定义变量配置的与 PATH 内容相同
  path=${PATH}
  echo $path
  /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  范例二:假设要将前两个目录删除掉,如何显示?
    echo ${path#/*kerberos/bin:}
  /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  解释:
   DSC0000.png
  范例三:我想要删除前面所有的目录,仅保留最后一个目录
    echo ${path##/*:}
  /root/bin
  多加了一个 # 变成 ## 之后,变成『删除掉最长的那个数据』

  • # :符合取代文字的『最短的』那一个;
  • ##:符合取代文字的『最长的』那一个
  如果想要『从后面向前删除变量内容』呢? 这个时候就得使用百分比 (%) 符号了
  范例四:我想要删除最后面那个目录,亦即从 : 到 bin 为止的字符串
    echo ${path%:*bin}
  /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  范例五:那如果我只想要保留第一个目录呢?
    echo ${path%%:*bin}
  /usr/kerberos/sbin
  了解了删除功能后,接下来谈谈取代吧
  范例六:将 path 的变量内容内的 sbin 取代成大写 SBIN:
  echo ${path/sbin/SBIN}
  /usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
这个部分就容易理解的多了!关键词在于那两个斜线,两斜线中间的是旧字符串,后面的是新字符串
    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
  echo $username
                   <==由于出现空白,所以 username 可能不存在,也可能是空字符串
  username=${username-root}
  echo $username
  root     <==因为 username 没有配置,所以主动给予名为 root 的内容。
  username="vbird tsai" <==主动配置 username 的内容
  username=${username-root}
  echo $username
  vbird tsai   <==因为 username 已经配置了,所以使用旧有的配置而不以 root 取代
  范例二:若 username 未配置或为空字符串,则将 username 内容配置为 root
  username=""
  username=${username-root}
  echo $username
            <==因为 username 被配置为空字符串了!所以当然还是保留为空字符串!
  username=${username:-root}
  echo $username
  root   <==加上『 : 』后若变量内容为空或者是未配置,都能够以后面的内容替换!
变量配置方式str 没有配置str 为空字符串str 已配置非为空字符串
var=${str-expr}var=exprvar=var=$str
var=${str:-expr}var=exprvar=exprvar=$str
var=${str+expr}var=var=exprvar=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 输出至 stderrvar=var=$str
var=${str:?expr}expr 输出至 stderrexpr 输出至 stderrvar=$str
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-147041-1-1.html 上篇帖子: Shell脚本的编写,sed的使用以及一些正则表达式 下篇帖子: shell基础知识
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表