: 开头是做什么的?

What does : at the beginning do?

当我通读安装 bash 脚本时,我偶然发现了这一行:

: ${SUDO:=sudo}
"${SUDO}" apt install vim

我知道如果之前没有设置 SUDOSUDO 会设置为 sudo。 但是开头的冒号在这里做什么?

: 是一个什么都不做的命令——忽略它的参数和任何输入,并以零退出状态退出。参见 posix colonman colon

它通常用于无限循环:

while :; do

在空表达式中:

if something; do
     : do nothing
done

触发一些调试输出:

cmd=(strange command)
set -x
: "${cmd[@]}"  # set -x will show

用于临时注释内容和使用此处文档进行多行注释:

: <<EOF
   A multiline comment.
EOF

或者如您的问题所述,如果未设置变量,则使用 ${...:=...} 扩展为变量分配一些默认值。请注意,您应该 引用 扩展,这样文件名扩展就不会发生,因为在某些极端情况下,此类表达式中的文件名扩展可能会导致您的脚本无缘无故地神奇地滞后。

# SUDO="${SUDO:+sudo}"   <- you have to type SUDO twice :(
: "${SUDO:=sudo}"        # <- only type SUDO once!