Playing with variables and environment variables
Variables are essential components of every programming language and are used to hold varying data. Scripting languages usually do not require variable type declaration before its use as they can be assigned directly. In Bash, the value for every variable is string, regardless of whether we assign variables with quotes or without quotes. Furthermore, there are variables used by the shell environment and the operating environment to store special values, which are called environment variables. Let us look at how to play with some of these variables in this recipe.
Getting ready
Variables are named with the usual naming constructs. When an application is executing, it will be passed a set of variables called environment variables. To view all the environment variables related to a terminal, issue the env
command. For every process, environment variables in its runtime can be viewed by:
cat /proc/$PID/environ
Set PID
with a process ID of the process (PID
always takes an integer value).
For example, assume that an application called gedit
is running. We can obtain the process ID of gedit with the pgrep
command as follows:
$ pgrep gedit 12501
You can obtain the environment variables associated with the process by executing the following command:
$ cat /proc/12501/environ GDM_KEYBOARD_LAYOUT=usGNOME_KEYRING_PID=1560USER=slynuxHOME=/home/slynux
Note
Note that many environment variables are stripped off for convenience. The actual output may contain numerous variables.
The aforementioned command returns a list of environment variables and their values. Each variable is represented as a name=value pair and are separated by a null character (\0
). If you can substitute the \0
character with \n
, you can reformat the output to show each variable=value pair in each line. Substitution can be made using the tr
command as follows:
$ cat /proc/12501/environ | tr '\0' '\n'
Now, let us see how to assign and manipulate variables and environment variables.
How to do it...
A variable can be assigned as follows:
var=value
var
is the name of a variable and value
is the value to be assigned. If value
does not contain any space character (such as space), it need not be enclosed in quotes, Otherwise it is to be enclosed in single or double quotes.
Note that var = value
and var=value
are different. It is a usual mistake to write var =value
instead of var=value
. The later one is the assignment operation, whereas the earlier one is an equality operation.
Printing contents of a variable is done using by prefixing $
with the variable name as follows:
var="value" #Assignment of value to variable var. echo $var
Or:
echo ${var}
We will receive an output as follows:
value
We can use variable values inside printf
or echo
in double quotes:
#!/bin/bash #Filename :variables.sh fruit=apple count=5 echo "We have $count ${fruit}(s)"
The output will be as follows:
We have 5 apple(s)
Environment variables are variables that are not defined in the current process, but are received from the parent processes. For example, HTTP_PROXY
is an environment variable. This variable defines which proxy server should be used for an Internet connection.
Usually, it is set as:
HTTP_PROXY=192.168.1.23:3128 export HTTP_PROXY
The export
command is used to set the env
variable. Now any application, executed from the current shell script, will receive this variable. We can export custom variables for our own purposes in an application or shell script that is executed. There are many standard environment variables that are available for the shell by default.
For example, PATH
. A typical PATH
variable will contain:
$ echo $PATH /home/slynux/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
When given a command for execution, the shell automatically searches for the executable in the list of directories in the PATH
environment variable (directory paths are delimited by the ":" character). Usually, $PATH
is defined in /etc/environment
or /etc/profile
or ~/.bashrc
. When we need to add a new path to the PATH
environment, we use:
export PATH="$PATH:/home/user/bin"
Or, alternately, we can use:
$ PATH="$PATH:/home/user/bin" $ export PATH $ echo $PATH /home/slynux/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/user/bin
Here we have added /home/user/bin
to PATH
.
Some of the well-known environment variables are HOME
, PWD
, USER
, UID
, SHELL
, and so on.
Note
When using single quotes, variables will not be expanded and will be displayed as is. This means:
$ echo '$var' will print $var
Whereas, $ echo "$var"
will print the value of the $var
variable if defined or nothing at all if it is not defined.
There's more...
Let us see more tips associated with standard and environment variables.
Finding the length of a string
Get the length of a variable value using the following command:
length=${#var}
For example:
$ var=12345678901234567890$ echo ${#var} 20
The length
parameter will bear the number of characters in the string.
Identifying the current shell
To identify the shell which is currently being used, we can use the SHELL
variable, like so:
echo $SHELL
Or:
echo $0
For example:
$ echo $SHELL /bin/bash $ echo $0 /bin/bash
Checking for super user
UID
is an important environment variable that can be used to check whether the current script has been run as a root user or regular user. For example:
If [ $UID -ne 0 ]; then echo Non root user. Please run as root. else echo Root user fi
The UID
value for the root user is 0
.
Modifying the Bash prompt string (username@hostname:~$)
When we open a terminal or run a shell, we see a prompt string such as user@hostname: /home/$
. Different GNU/Linux distributions have slightly different prompts and different colors. We can customize the prompt text using the PS1
environment variable. The default prompt text for the shell is set using a line in the ~/.bashrc
file.
We can list the line used to set the
PS1
variable as follows:$ cat ~/.bashrc | grep PS1 PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
To set a custom prompt string, enter the following command:
slynux@localhost: ~$ PS1="PROMPT>" PROMPT> Type commands here # Prompt string changed.
We can use colored text using the special escape sequences such as
\e[1;31
(refer to the Printing in the terminal recipe of this chapter).
There are also certain special characters that expand to system parameters. For example, \u
expands to username, \h
expands to hostname, and \w
expands to the current working directory.