Explanation of colon operator in ": ${foo=value}"

Bash

Bash Problem Overview


I understand the colon operator in bash that acts like [a null][noop], and I know it's used in [parameter expansion][param], as well as being used other ways, but can someone explain this:

: ${SOMETHING='value'}

From experimentation I know that this sets the environment variable $SOMETHING to 'value' but why?

"Just because it does" is a valid answer but then please point me to the documentation for it (which I can't seem to find) or a proper name for this usage would be useful. I'm hoping there's a more enlightening explanation though.

[noop]: <http://devmanual.gentoo.org/tools-reference/bash/index.html#multiple-selection> "Bash Conditionals" [param]: <http://www.faqs.org/docs/bashman/bashref_29.html> "Shell Parameter Expansion"

Bash Solutions


Solution 1 - Bash

The expression ${SOMETHING='value'} sets SOMETHING to value if it isn't already set. This is a useful operator to have in many situations. However, it also returns the assigned value, so if you simply executed

${SOMETHING='value'}

then your shell would try to invoke the command value. This might or might not do something unwanted; at the least it would throw a message "value: command not found".

To avoid this you can use the no-op :, which evaluates its argument and then throws it away, rather than executing it. This is documented here.

Solution 2 - Bash

Explained here : http://tldp.org/LDP/abs/html/parameter-substitution.html

> If parameter not set, set it to default. > > Both forms nearly equivalent. The : makes a difference only when > $parameter has been declared and is null, [1] as above. > echo ${var=abc} # abc echo ${var=xyz} # abc # $var had already been set to abc, so it did not change.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPeter CoultonView Question on Stackoverflow
Solution 1 - BashKilian FothView Answer on Stackoverflow
Solution 2 - BashArnaud F.View Answer on Stackoverflow