bash参数扩展$ {parameter:-SUB} vs $ {parameter-SUB}

时间:2015-12-08 02:37:00

标签: bash

我看到一些bash脚本(在GNU bash上,版本3.2.51(1)),参数替换如

function foo() {
  local x=${1-XYZ} ##### (1) 
  echo "x=${x}."
}
foo ####### this prints x=XYZ
foo ABCD ###### this prints x=ABCD

我更常见的是(1)x=${1:-XYZ},我也可以在Bash参考页面here中找到它。两者都是正确的,还是在后台发生了其他事情,在某些情况下可能会失败?

它不一定是$1 - 只要未定义${XX-sub}中的变量,它就会选择替代品。 非常感谢

3 个答案:

答案 0 :(得分:2)

如果未设置value,请使用default,否则请使用value

var=${value-$default}
var=${value:-$default}   # ':' use default even if value declared and empty/null

例如(缺少命令行参数):

value=
var=${value-$default}     # not set
var=${value:-$default}    # set to $default

答案 1 :(得分:2)

不同之处在于-如果参数未设置(即未定义)则使用备用值,:-使用它未设置或为空(即设置为空字符串)。例如:

$ foo() {
> echo "Argument 1 with :- is '${1:-altval}', with just - is '${1-altval}'"
> echo "Argument 2 with :- is '${2:-altval}', with just - is '${2-altval}'"
> }
$ foo ""
Argument 1 with :- is 'altval', with just - is ''
Argument 2 with :- is 'altval', with just - is 'altval'

这里我将一个(空)参数传递给函数,因此$1设置为null,但$2未设置。

答案 2 :(得分:0)

${var-word}返回"字"如果var未定义。如果没有,则返回$ {var}。 ${var:-word}返回"字"如果var为null或未定义。如果没有,则返回$ {var}。

您可以使用此示例脚本轻松检查差异。

#!/bin/bash
var1=""  ## var1 is Null
#var2=   ## var2 is undefined
var3="value3"  ## var3 is set

echo '${var1}': ${var1} "(NULL)"
echo '${var2}': ${var2} "(Undefined)"
echo '${var3}': ${var3}

echo '${var1-foo}': ${var1-foo}
echo '${var2-foo}': ${var2-foo}
echo '${var3-foo}': ${var3-foo}

echo '${var1:-foo}': ${var1:-foo}
echo '${var2:-foo}': ${var2:-foo}
echo '${var3:-foo}': ${var3:-foo}

此脚本输出。

${var1}: (NULL)
${var2}: (Undefined)
${var3}: value3
${var1-foo}:
${var2-foo}: foo
${var3-foo}: value3
${var1:-foo}: foo
${var2:-foo}: foo
${var3:-foo}: value3