Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is a hyphen beside a shell variable

I saw in some of our scripts that there is a hyphen attached to a shell variable. For example:

if [ -z ${X-} ]

What does this hyphen symbol beside the variable do here. I cannot find any documentation online for this.

like image 358
user1939168 Avatar asked Oct 06 '15 07:10

user1939168


People also ask

What does a hyphen mean in bash script?

In man bash , at the end of the single-character options there is:- -- A -- signals the end of options and disables further option processing. Any arguments after the -- are treated as filenames and arguments.

Can a variable have a dash?

dashes are not permitted in variable names in javascript (the parser will interpret them as a subtraction symbol) and thus are not permitted in environment variable names.

Can bash variables have a dash?

I believe that only letters, numbers, and underscore are allowed for bash variables. This is the case in many programming languages (javascript being an exception).

What are the shell variables?

Shell (local) variables – Variables that affect only the current shell. In the C shell, a set of these shell variables have a special relationship to a corresponding set of environment variables. These shell variables are user, term, home, and path.


1 Answers

It's all explained in the Shell Parameter Expansion section of the manual:

${parameter:-word}

If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.

Just before this there is:

Omitting the colon results in a test only for a parameter that is unset.

So:

${X-stuff}

expands to:

  • The expansion of $X if X is set
  • stuff if X is unset.

Try it:

$ unset X
$ echo "${X-stuff}"
stuff
$ X=
$ echo "${X-stuff}"

$ X=hello
$ echo "${X-stuff}"
hello
$

Now your expansion is

${X-}

so you guess that it expands to the expansion of $X if X is set, and to the null string if X is unset.


Why would you want to do this? to me it seems that this is a workaround the set -u:

$ set -u
$ unset X
$ echo "$X"
bash: X: unbound variable
$ echo "${X-}"

$

Finally, your test

if [ -z "${X-}" ]

(note the quotes, they are mandatory) tests whether X is nil (regardless of X being set or not, even if set -u is used).

like image 129
gniourf_gniourf Avatar answered Oct 19 '22 20:10

gniourf_gniourf