我正在查看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 次 |
| 最近记录: |