在Bash中使用VAR = $ {n:-m}

时间:2013-10-16 20:23:15

标签: bash syntax

我想基于这里发布的一个bash编写遗传算法:http://father-natures.blogspot.mx/2013/04/implementing-genetic-algorithm-in-bash.html。我在提前编写脚本时非常不熟悉,而且我不知道VAR = $ {n:-m}代表什么。我的猜测是:

POOL_SIZE=${1:-6}

让$ 1 = -6,但是当我检查$ 1时它是空的,当我检查$ POOLSIZE时,我得到6。

libertad@engrane4:~$ echo "POOL_SIZE"
6

这对我来说很困惑。如果我希望变量为6,我会写:

POOL_SIZE=6

你能告诉我我错过了什么(这个任务还在做什么)?

谢谢,

1 个答案:

答案 0 :(得分:7)

如果$1为空,则设置默认值。

来自3.5.3 Shell Parameter Expansion in the Bash Reference Manual

  

<强> $ {参数:-word}

     

如果参数未设置或为null,则替换单词的扩展。   否则,参数的值将被替换。

实施例

$ echo ${a:-"hello"}
hello
$ a="test"
$ echo ${a:-"hello"}
test

根据您的评论

  

谢谢,@ fedorqui。原始变量是POOL_SIZE = $ {1:-6},   REPRO_CHANCE = $ {2:-30},BEST_FITS = $ {3:-70}。现在我想知道是否   $ {POOL_SIZE:-6},$ {REPRO_CHANCE:-30}和$ {BEST_FITS:-70}将是   同样的,为什么需要的数字

如果你有

POOL_SIZE=${1:-6}
REPRO_CHANCE=${2:-30}
BEST_FITS=${3:-70}

这是因为POOL_SIZEREPRO_CHANCEBEST_FITS应该包含$1$2$3的值。任何$n表示nth参数,例如来自脚本。所以如果你有以下脚本:

$ cat a
#!/bin/bash

POOL_SIZE=${1:-6}
REPRO_CHANCE=${2:-30}
BEST_FITS=${3:-70}

echo "POOL_SIZE=$POOL_SIZE"
echo "REPRO_CHANCE=$REPRO_CHANCE"
echo "BEST_FITS=$BEST_FITS"

然后用不同数量的参数执行它将产生:

$ ./a
POOL_SIZE=6
REPRO_CHANCE=30
BEST_FITS=70

$ ./a 2 2 2
POOL_SIZE=2
REPRO_CHANCE=2
BEST_FITS=2

$ ./a 24 2
POOL_SIZE=24
REPRO_CHANCE=2
BEST_FITS=70

我希望它能说清楚。


另请注意${var:-value}${var-value}不一样:What is the difference between ${var:-word} and ${var-word}?