if [ -n "${BASH-}" -o -n "${ZSH_VERSION-}" ] ; then
    hash -r 2>/dev/null
fi
Where can I find the reference on this? Thanks.
if [ -n "${BASH-}" -o -n "${ZSH_VERSION-}" ] ; then
    hash -r 2>/dev/null
fi
Where can I find the reference on this? Thanks.
 
    
    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:
'', thus: also null.'') if var is unset.All that is just really:
'' when var is either unset or null.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"
 
    
    Its a bash parameter expansion thats used for checking if a variable is not set
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
Basic parameter expansion is covered in the man bash docs
(line 939 of bash man page).  
see: POSIX
also see this SO answer
 
    
     
    
    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.
