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

Lib*_*oja 2 syntax bash

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

POOL_SIZE=${1:-6}
Run Code Online (Sandbox Code Playgroud)

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

libertad@engrane4:~$ echo "POOL_SIZE"
6
Run Code Online (Sandbox Code Playgroud)

这让我很困惑.如果我希望变量为6,我会写:

POOL_SIZE=6
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

fed*_*qui 7

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

Bash参考手册中的3.5.3 Shell参数扩展开始:

$ {参数:-word}

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

$ echo ${a:-"hello"}
hello
$ a="test"
$ echo ${a:-"hello"}
test
Run Code Online (Sandbox Code Playgroud)

根据您的评论

谢谢,@ 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}
Run Code Online (Sandbox Code Playgroud)

这是因为POOL_SIZE,REPRO_CHANCE并且BEST_FITS都应该包含的价值$1,$2$3.Any $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"
Run Code Online (Sandbox Code Playgroud)

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

$ ./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
Run Code Online (Sandbox Code Playgroud)

我希望它能说清楚.


还要注意${var:-value}并且${var-value}不一样:$ {var:-word}和$ {var-word}之间有什么区别?.