冒号在docker入口点bash脚本行开头

我正在通过一个入口点脚本查看一个docker镜像 ,他们有以下几行(53-54)

: ${POSTGRES_USER:=postgres} : ${POSTGRES_DB:=$POSTGRES_USER} 

我看到了这个线程:(冒号)GNU Bash内build的目的是什么?

并能够弄清楚:意思是真实的,并且:=被用来分配默认值,但是它并没有真正触及到什么:在行的开头,至less对于这个特定的情况。

在Bash shell和衍生工具如Bash中, :是一个没有操作的命令:也就是说,它什么都不做,但是参数是正常计算的。 把它和一个注释( # )相对比,它根本不会做任何事情(在#之后,忽略)。

这个语法:

 : ${POSTGRES_USER:=postgres} 

通常用于将默认值分配给variables。 语法${POSTGRES_USER:=postgres} (a)将variablesPOSTGRES_USER设置为postgres 只有当它还没有一个值,然后(b)计算到$POSTGRES_USER的值。 如果我们使用评论:

 # ${POSTGRES_USER:=postgres} 

……什么都不会发生,因为壳简单地忽略了整条线。 使用:意味着${...}expression式仍然被计算,所以如果需要, POSTGRES_USER被分配一个值。

更新

如果没有:在行的开头,那么这个:

 ${POSTGRES_USER:=postgres} 

将是一个shell命令! shell将首先评估variables扩展,并提出像postgres ,所以你将有一个有效的看起来像这样的shell脚本:

 postgres 

这可能会给你错误:

 bash: postgres: command not found...