“var = $ {var:-word}”和“var = $ {var:= word}”之间有什么区别?

时间:2013-07-01 12:39:16

标签: linux bash

我在这上面阅读了bash手册页,但我不明白其中的区别。我测试了它们,它们似乎产生了完全相同的结果。

如果未通过命令行参数设置值,我想设置变量的默认值。

#!/bin/bash

var="$1"
var=${var:-word}
echo "$var"

如果word为空,则上面的代码回显$1,如果不为空,则回显$1的值。这样做:

#!/bin/bash

var="$1"
var=${var:=word}
echo "$var"

根据Bash手册页,

  

${parameter:-word}使用默认值。如果参数未设置或为null,则替换单词的扩展。否则,参数的值将被替换。

     

${parameter:=word}分配默认值。如果参数未设置或为null,则将字的扩展分配给参数。然后替换参数的值。不能以这种方式分配位置参数和特殊参数。

它们是否相同而${parameter:=word}只是做得更多?

4 个答案:

答案 0 :(得分:16)

${var:=word}

等于

var=${var:-word}

答案 1 :(得分:15)

当您使用var两次时,您无法看到与示例的区别,但您可以通过两个不同的变量看到它:

foo=${bar:-something}

echo $foo # something
echo $bar # no assignement to bar, bar is still empty

foo=${bar:=something}

echo $foo # something
echo $bar # something too, as there's an assignement to bar

答案 2 :(得分:7)

区别在于使用赋值。如果没有=,则值word 已使用,但实际上未分配var

对于只读变量而言,这是最重要的 - 这是您无法分配给它们的地方。

例如,您永远不能分配编号的位置参数。因此,如果您希望函数使用默认值处理可选的第一个参数,则可以使用如下代码:

${1:-default}

您不能在那里使用${1:=default}版本,因为您无法分配位置参数1。它是只读的。

答案 3 :(得分:3)

您有时会看到: command:

的作业扩展
# set defaults
: ${foo:=bar} ${baz:=qux}