Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does the '-' (dash) after variable names do here?

Tags:

linux

bash

People also ask

Can you use dashes in variable names?

Hyphens are used as subtraction and negation operators, so they cannot be used in variable names.

Can bash variables have dashes?

# As of version 3 of Bash, periods are not allowed within variable names. Using a hyphen or other reserved characters in a variable name (or function name).


Variables inside a ${...} are called « Parameter Expansion ».
Search for that term in the online manual, or the actual manual (line 792).
The ${var-} form is similar in form to ${var:-}. The difference is explained just one line before the :- expansion (line 810):

... bash tests for a parameter that is unset or null. Omitting the colon results in a test only for a parameter that is unset.

Thus, this form is testing only when a variable is unset (and not null), and replaces the whole expansion ${...} for the value after the -, which in this case is null.

Therefore, the ${var-} becomes:

  1. The value of var when var has a value (and not null).
  2. Also the value of var (the colon : is missing!) when var is null:'', thus: also null.
  3. The value after the - (in this case, null '') if var is unset.

All that is just really:

  1. Expand to '' when var is either unset or null.
  2. Expand to the value of the var (when var has a value).

Therefore, the expansion changes nothing about the value of var, nor it's expansion, just avoids a possible error if the shell has the option nounset set.

This code will stop on both uses of $var:

#!/bin/bash
set -u

unset var

echo "variable $var"
[[ $var ]] && echo "var set"

However this code will run without error:

#!/bin/bash
set -u

unset var
echo "variable ${var-}"
[[ ${var-} ]] && echo "var set"

Under normal circumstances, ${FOO-} behaves exactly the same as ${FOO}.

However, with set -u, expansion of unset variables becomes an error by default.

So ${FOO} could be an error, but ${FOO-} never will be.


Its a bash parameter expansion thats used for checking if a variable is not set

Explanation

When you use ${ZSH_VERSION-WORD} as opposed to $ZSH_VERSION in your bash script, bash will perform additional logic

if $ZSH_VERSION is set
then 
    simply use the value of $ZSH_VERSION as per normal

elseif

$ZSH_VERSION is NOT set 
then
    use value of WORD - which isnt provided in your case - so null

is used

References

Basic parameter expansion is covered in the man bash docs (line 939 of bash man page).

see: POSIX

also see this SO answer