冒号在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...