:bash的冒号命令


28

作为bash新手,我一直在通过copy / paste + github升级.bashrc,并且遇到了:使我和google都感到困惑的命令。例如: ${USER_BASH_COMPLETION_DIR:=~/.bash_completion.d}

最初没有在我的.bashrc中使用此语句,而是在终端中键入以下内容(->表示相关输出):

: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
echo $USER_BASH_COMPLETION_DIR
-> /Users/sh/.bash_completion.d

和:

: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
export USER_BASH_COMPLETION_DIR=asdf
echo $USER_BASH_COMPLETION_DIR
-> asdf

但:

: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
export USER_BASH_COMPLETION_DIR=asdf
: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
echo $USER_BASH_COMPLETION_DIR
-> asdf

我不明白!

1)冒号命令如何设置变量但不能覆盖一个变量export

2):在某些.bashrc中使用背后的逻辑是什么?

使用Mac 10.6.8

(从上下文中包括关键字冒号只是为了帮助像我这样尝试搜索该词的其他人)


Answers:


45

:是一个内置的shell,基本上等效于该true命令。通常在if声明后用作无操作。您可以从堆栈溢出中阅读有关此问题的更多信息。

${varname=value}基本手段设定的值$varname,以value如果$varname尚未设置,然后返回$ VARNAME的值。尽管如果您尝试在命令行上运行它,它将尝试运行返回的值。将:no 放在前面作为禁止操作可防止bash尝试运行该值。

请注意,有两种形式略有不同:

${varname:=value}

如果varname未设置或为null,则将varname设置为value。

${varname=value}

仅在当前未设置varname的情况下才设置varname的值(即,不会将varname从“”更改为value)

(感谢chepner在评论中进行了澄清)。

有人引用此方法

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.