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

m0m*_*eni 15 bash docker

我正在查看docker脚本的入口点脚本,他们有以下几行(53-54)

: ${POSTGRES_USER:=postgres}
: ${POSTGRES_DB:=$POSTGRES_USER}
Run Code Online (Sandbox Code Playgroud)

我看到这个帖子的目的是什么:(冒号)GNU Bash内置?

并且能够找出:意味着真实并且:=用于分配默认值,但它并没有真正触及:至少对于这种特定情况在该行开头的内容.

lar*_*sks 42

在Bourne shell和Bash这样的衍生产品中,:是一个无操作命令:也就是说,它没有做任何事情,但是通常会对参数进行评估.将其与注释(#)进行对比,注释()根本不执行任何操作(#只需忽略后面的注释).

这个语法:

: ${POSTGRES_USER:=postgres}
Run Code Online (Sandbox Code Playgroud)

通常用于为变量分配默认值.语法${POSTGRES_USER:=postgres}(a)将变量设置POSTGRES_USERpostgres 仅当它还没有值时,然后(b)计算值的值$POSTGRES_USER.如果我们使用评论:

# ${POSTGRES_USER:=postgres}
Run Code Online (Sandbox Code Playgroud)

......什么都不会发生,因为shell只是忽略了整条线.使用:意味着${...}仍然计算表达式,因此POSTGRES_USER在必要时分配一个值.

更新

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

${POSTGRES_USER:=postgres}
Run Code Online (Sandbox Code Playgroud)

将是一个shell命令!shell首先会评估变量扩展并提出类似的东西postgres,所以你会得到一个有效的shell脚本:

postgres
Run Code Online (Sandbox Code Playgroud)

哪个可能会给你错误:

bash: postgres: command not found...
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,我们**不能**在 `${}` 之外使用 `:=`,例如 `POSTGRES_USER:=postgres`,因为 `:=` 是 shell 参数扩展的一部分 https:// /www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameter-Expansion (3认同)
  • 很好的答案。在我看来,语法 `POSTGRES_USER=${POSTGRES_USER:-postgres}` 有更清晰的意图,在“99% 的情况下”它不是等效的吗? (3认同)