shell中的变量替换

转载 2016年08月29日 10:03:51

(1):=句法

      在这种替换中,使用和前例中相同的:=句法来设置默认值。


       在使用“:=”进行比较时,username变量已经被定义了,但是它的值为空。因此,这里对echo命令使用了变量LOGNAME的值,即设置变量username的值为LOGNAME的值。

       有了这个特殊的句法,只有当变量username已被定义,而且有一个实际的非空值时,变量username才会被设置为变量LOGNAME的值。和前例的主要不同是使用活动命令(echo)而不是被动的冒号来设置变量的默认值,当活动命令被调用时,默认赋值仍然会执行,并输出显示结果。

(2)=句法

      下面的语句和:=句法非常类似,但是没有冒号。


      和前面一样,变量username已经被定义,但是它的值为空。在这个句法中,命令将会输出“echo”之后语句的执行结果。因为变量username虽然为空值,但已经被定义了,所以除了一个回车不会再有其他输出。只有当username变量完全没有定义时,才会将其设置为变量LOGNAME的值。

      当脚本或者函数需要依赖某些定义变量时,就要使用这种语法。它主要应用于登陆。如果一个特定环境变量还没有被定义,就可以给它赋予脚本所需要的值。

(3):-句法

      AA=${BB:-$CC}   如果BB为空,则AA等于CC,如果BB不为空,则AA为BB。且BB值保持不变

      在这个命令中,因为变量username虽然已被定义但是为空值,echo语句将使用LOGNAME变量的值。


      这里username变量的值保持不变。这个命令和使用=句语法的不同之处是,在此命令被执行前,仅仅在代码中的"${}"句法中做替换。也就是说,echo命令将输出LOGNAME变量的值,但是这个值不会被赋给username变量。

(4)-句法

      当删除上述的:-语句中的冒号,即变成-的时候,因为username变量已被定义,输出将为空。如果未定义,就会使用LOGNAME变量的值。还有一点也与:-句法相同,即username变量的值没有改变。


       当脚本评价或检查系统环境的时,:-句法和-句法都可以使用。这两种检查基本上是相反的,它们用默认值替换变量,或者甚至于不依赖username变量是否已经被定义。如果脚本中急需要一组被定义的变量,也需要一些不该被定义的变量,那么在脚本执行任务之前组合这两种句法,肯定可以实现正确的设置。

(5):?句法

       使用:?句法时,如果username变量已被定义为非空值,在echo命令中就会使用username变量的值。如果username变量已被定义但却没有一个真正的值(也就是说非空)或者完全未被定义,那么在echo命令中就会使用LOGNAME的值,并且脚本退出执行


      如果把问号字符的参数改为某种错误字符,那这个语句就会在代码调试和查找未定义变量时变得很有用。这段代码不仅仅输出字符串,而且会显示代码在脚本中所在行的位置。

(6)?句法

       从:?句法中去掉冒号使用username变量不必一定为非空值。如果username只被设置为一个空值,那么将使用这个空值。相反的,如果username变量没有被定义,则同前所述的:?句法,执行LOGNAME替换,脚本退出运行,并显示退出时所在代码行在脚本中的位置。


      在脚本调试过程中,需要检查变量是否已被定义或者是非空的是否,:?和?句法是非常有用的。这个代码最大的优点是脚本会从出错行退出,而且会显示出错误行行号。在要显示的文本中加上类似于“is undefined”或者“has a null value”信息,可以更清楚的说明脚本中的问题。

(7):+句法

      和前面的例子相比,这个句法有相反的作用。这是因为,只有当变量已被定义而不是未定义的时候,“${}”表达式才执行替换。


       如果这里的username变量已被定义而且非空,因此使用LOGNAME的值。如果username变量未定义,或者已定义但为空,则将使用空值。在任何情况下,username变量的值都不会改变。

(8)+句法

       如果去掉前例:+中的冒号成+,表示一旦变量username被定义,“${}”表达式都将使用LOGNAME的值;进行这个替换时,username变量不需要有一个实际的值(即非空值)。如


       “:+”、“+”句法的用法很多是和“:-”、“-”句法的用法相同的。最主要的区别是“:+”、“+”示例检查的是一个已定义的变量,而不是未定义的变量。这类类似于加法、减法——一枚硬币的两面。

1

【shell脚本】命令代换 ` `, $( ) ,整数运算$(( )),变量代换${ },eval命令

一、命令代换命令代换的意识是:先完成引号里/括号里的命令行,然后将其结果替换出来,再重组成新的命令行。shell脚本里,可用于命令代换的有反引号(` `),和$()。但是,我们知道Linux下不会存在...
  • pointer_y
  • pointer_y
  • 2017年03月24日 12:10
  • 586

shell 变量替换

1,参数替换:                    不含有“:”的,只要定义了,就生效,不管是否为空                   含有“:”的,即使定义了,但是为空就不生效         ...
  • xuhongning
  • xuhongning
  • 2011年02月17日 14:45
  • 11952

shell变量里的字符替换

b=${a/123/321};将${a}里的第一个123替换为321b=${a//123/321};将${a}里的所有123替换为321shell调试:sh -x aaa.shfrom:http://...
  • Augusdi
  • Augusdi
  • 2014年11月11日 13:04
  • 34478

linux shell 字符串替换

%x=abcdabcd %echo ${x/a/b} # 只替换一个 bbcdabcd %echo ${x//a/b} # 替换所有 bbcdbbcd
  • lepton126
  • lepton126
  • 2014年06月16日 14:21
  • 15706

【shell】变量内容的删除和替换

【背景】 linux提供了一些可以直接对变量进行操作的符号。通过这些符号,变量中的部分内容可以被删除、替换等,使用它们可以减少代码的行数并提高可读性。 【涉及符号】 ${var#patt...
  • csyuanA
  • csyuanA
  • 2017年08月01日 23:52
  • 418

Linux shell编程 11 ---- 变量的高级用法

1 内部变量     1
  • cgl1079743846
  • cgl1079743846
  • 2013年10月18日 18:24
  • 1556

BASH中关于变量内替换详解

总结关于BASH中变量的内部替换备忘
  • liudglink
  • liudglink
  • 2016年06月20日 13:18
  • 708

shell变量的子串的删除/替换

${#string} 返回$string的长度${string:position} 在$string中,从$position位置之后开始提取子串${string:position:length} ...
  • github_33736971
  • github_33736971
  • 2017年01月02日 20:41
  • 2004

shell脚本里面利用for循环给动态变量赋值的方法

这个脚本的目的是:从文件/etc/ipsecrules.conf里面动态截取字符串,并把字符串赋值给不同的变量:status,connName,便于脚本后面的代码使用。 首先我把想要赋值的变量以字符...
  • menlinshuangxi
  • menlinshuangxi
  • 2012年10月20日 12:09
  • 16271

shell for循环、循环变量值付给其他shell脚本

本文主要将在shell中如何编写for循环,并将循环变量作为下个shell脚本的参数。...
  • July_whj
  • July_whj
  • 2017年06月20日 09:03
  • 3836
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:shell中的变量替换
举报原因:
原因补充:

(最多只允许输入30个字)