我正在查看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_USER
为postgres
仅当它还没有值时,然后(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)
归档时间: |
|
查看次数: |
2945 次 |
最近记录: |