我正在查看an entrypoint script for a docker image,他们有以下几行(53-54)
: ${POSTGRES_USER:=postgres}
: ${POSTGRES_DB:=$POSTGRES_USER}
我看到了这个帖子What is the purpose of the : (colon) GNU Bash builtin?
并且能够发现:
意味着真实并且:=
用于指定默认值,但它并没有真正触及:
处的内容至少对于这个特定情况,该行的开头。
答案 0 :(得分:34)
在Bourne shell和像Bash这样的派生类中,:
是一个无操作命令:也就是说,它不会执行任何操作,但会正常评估参数。将其与评论(#
)进行对比,评论完全不做任何事情(仅忽略#
之后的评论)。
此语法:
: ${POSTGRES_USER:=postgres}
通常用于为变量指定默认值。语法${POSTGRES_USER:=postgres}
(a)将变量POSTGRES_USER
设置为postgres
,只有它还没有值,然后(b)评估为$POSTGRES_USER
的值。如果我们使用评论:
# ${POSTGRES_USER:=postgres}
......什么都不会发生,因为shell只是忽略整行。使用:
表示仍会评估${...}
表达式,因此如果需要,会为POSTGRES_USER
分配一个值。
<强>更新强>
如果该行的开头没有:
,那么:
${POSTGRES_USER:=postgres}
将是一个shell命令! shell会首先评估变量扩展并提出像postgres
这样的东西,所以你会有一个有效的shell脚本:
postgres
哪个可能会给你错误:
bash: postgres: command not found...