Bash Shell Scripting/Variables
In a Bash script, there are a few different kinds of parameters that can hold values. One major kind of parameter is variables: named parameters. If you are familiar with almost any other imperative programming language (such as C, BASIC, Fortran, or Pascal), then you are already familiar with variables. The following simple script uses the variable location
to hold the value world
, and prints out a "Hello, world!" message:
location=world # store "world" in the variable "location"
echo "Hello, ${location}!" # print "Hello, world!"
As you can see, the string ${location}
in the second line was replaced by world
before that command was run. This substitution is known as variable expansion.
Variable expansion is more flexible than you might suspect. For example, it can even hold the name of the command to run:
cmd_to_run=echo # store "echo" in the variable "cmd_to_run"
"${cmd_to_run}" 'Hello, world!' # print "Hello, world!"
In both of the above examples, we have used the notation ${variable_name}
to perform the variable expansion. The briefer notation $variable_name
− without curly brackets − would have the same effect in these cases. Sometimes the curly brackets are necessary (for example, ${foo}bar
cannot be written as $foobar
, because the latter would be interpreted as ${foobar}
), but they can usually be omitted, and real-world scripts usually omit them.
Of course, needless to say, the above are not very realistic examples; they demonstrate only how to use variables, not why or when to use them. If you are familiar with other imperative programming languages, then it is probably already obvious to you why and when you would use variables; if not, then this should become clear as you read through this book and see examples that use them more realistically.
You may have noticed that we have used double-quotes "
, rather than single-quotes '
, for character-strings that include variable expansions. This is because single-quotes prevent variable expansion; a command such as echo '${location}'
will print the actual string ${location}
, rather than printing the value of a variable named location
.
It is generally a good idea to wrap variable expansions in double-quotes, because otherwise the results of variable expansion will undergo filename expansion, as well as word splitting (whereby white-space is used to separate the words that make up a command). For example, this script:
foo='a b*' # store "a b*" in the variable "foo"
echo $foo
is liable to print something like a ba.txt bd.sh
, which is probably not what we want. Real-world scripts frequently do not include double-quotes except when they are clearly necessary, but this practice sometimes leads to confusing bugs.
Tip: It is generally a good idea to wrap variable expansions in double-quotes; for example, use |
A number of variables have special significance. For example, the variable PATH
determines the list of directories that Bash should search in when trying to run an external program; if it is set to /usr/bin:/bin
, then the command cp src.txt dst.txt
will look to run either /usr/bin/cp
or /bin/cp
. The variable HOME
is pre-initialized to the current user's home directory, and it determines the behavior of tilde-expansion. For example, if a script sets HOME=/foo
, then echo ~/bar
will print /foo/bar
. (This will not actually change the user's home directory, however.)