zoukankan      html  css  js  c++  java
  • 【Shell】变量的取用、删除、取代与替换

    ——来自《鸟哥的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

    解释:

    范例三:我想要删除前面所有的目录,仅保留最后一个目录

      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=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

     

  • 相关阅读:
    AGC037F Counting of Subarrays
    AGC025F Addition and Andition
    CF506C Mr. Kitayuta vs. Bamboos
    AGC032D Rotation Sort
    ARC101F Robots and Exits
    AGC032E Modulo Pairing
    CF559E Gerald and Path
    CF685C Optimal Point
    聊聊Mysql索引和redis跳表
    什么是线程安全
  • 原文地址:https://www.cnblogs.com/shirley130912/p/4301769.html
Copyright © 2011-2022 走看看