Open main menu

CDOT Wiki β

BASH Variables

Revision as of 08:18, 16 September 2008 by Chris Tyler (talk | contribs) (Using a Variable's Value)

BASH supports one type of variable: a string.

Creating or Assigning a Variable

To create a variable or change the value assigned a value to a variable, write the variable name, an equal sign, and the value, with no space:

X=5
COLOUR="Red"
NAME="Jason Smith"
EMAIL="jsmith@example.com>

Variable names must start with a letter and contain only letters, underscores, and digits. Variable names are case-sensitive, and UPPERCASE is often used to make it easy to distinguish between variable names and commands and arguments.

Reading a Variable

The read command will read a line of input from stdin and assign it to a variable:

read INPUT

This example will read a line of input from stdin (usually the keyboard) and assign it to the variable INPUT.

Seeing All Variables

The set command will display the value of all current variables:

$ set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="33" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='3.2.33(1)-release'
COLORS=/home/chris/.dir_colors.xterm
COLORTERM=gnome-terminal
COLUMNS=80
CVS_RSH=ssh
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-fFVokEovDE,guid=4eb682a22a695ccd33b24f0048cad335
DESKTOP_SESSION=default
DESKTOP_STARTUP_ID=
DIRSTACK=()
DISPLAY=:0.0
EUID=500
GDMSESSION=default
GDM_LANG=en_US.UTF-8
GDM_XSERVER_LOCATION=local
GNOME_DESKTOP_SESSION_ID=Default
GNOME_KEYRING_PID=3441
GNOME_KEYRING_SOCKET=/tmp/keyring-jBoBFl/socket
GROUPS=()
GTK_MODULES=gnomebreakpad
GTK_RC_FILES=/etc/gtk/gtkrc:/home/chris/.gtkrc-1.2-gnome2
G_BROKEN_FILENAMES=1
HISTFILE=/home/chris/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/home/chris
HOSTNAME=concord3.proximity.on.ca
HOSTTYPE=x86_64
IFS=$' \t\n'
INPUTRC=/etc/inputrc
KDEDIRS=/usr
KDE_IS_PRELINKED=1
LANG=en_US.UTF-8
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LINES=24
LOGNAME=chris
LS_COLORS='no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05; 
37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00; 
31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00; 
31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00; 
35:*.xpm=00;35:*.png=00;35:*.tif=00;35:*.doc=01;37;45:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/chris
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/kerberos/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/chris/bin
PIPESTATUS=([0]="0" [1]="0")
PPID=21127
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}"; echo -ne "\007"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/home/chris
SDL_AUDIODRIVER=esd
SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/3442,unix/unix:/tmp/.ICE-unix/3442
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=2
SSH_AGENT_PID=3503
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_AUTH_SOCK=/tmp/ssh-JdPTTt3442/agent.3442
TERM=xterm
UID=500
USER=chris
VIRSH_DEFAULT_CONNECT_URI=qemu:///system
WINDOWID=102760527
WINDOWPATH=7
XAUTHORITY=/tmp/.gdmYDNCHU
XDG_DATA_DIRS=/usr/local/share/:/usr/share/:/usr/share/gdm/
XDG_SESSION_COOKIE=8d5bac776a73b1f9ff24d500473f1f00-1221251892.355110-634173433
_=
colors=/home/chris/.dir_colors.xterm
consoletype=pty

Using a Variable's Value

To use the value of a variable in a command, place a dollar sign in front of the variable name:

echo "$COLOUR"
mail -s "Today's colour is $COLOUR" "$NAME <$EMAIL>" </tmp/message
if [ "$X" -eq 5 ]
then
   echo "Hooray!"
fi

You may optionally place the variable name within curly-braces (useful if there is text immediately after the variable name):

NUMBER="12"
echo "You are in ${NUMBER}th place!"

Adding to a Variable

To add to a variable, assign a value to it which contains the existing value plus new data. For example, to add ":." to the end of the PATH variable:

PATH="$PATH:."

Exporting Variables

Shell variables may be turned into environment variables, which causes them to be inherited by subprocesses:

$ TEST="Yes"
$ bash -c 'echo $TEST'
  
$ export TEST
$ bash -c 'echo $TEST'
Yes
$

Destroying Variables

A variable will be destroyed when the shell in which it was created exits. You can destroy it using the unset command:

$ Z=100
$ echo $Z
100
$ unset Z
$ echo $Z
 
$

Special Variables

BASH automatically updates the value of certain special variables:

Variable Description
$? Exit status of last pipeline
$$ Process ID of the current shell
$! Process ID of the last background pipeline
$RANDOM Random integer

Common Environment Variables

Linux systems use a number of common environment variables:

Variable Description
$PATH List of colon-separated directories to be used when searching for a command.
$HOME Current user's home directory.
$MAIL Current user's mailbox.
$DISPLAY X window display specification.
$TERM Current terminal type (used to analyze keypresses and send special codes such as colours and effects to the terminal).
SHELL Absolute pathname of the default shell for the current user.
HOSTNAME Name of the host (computer) on which the shell is executing.
PS1 Primary prompt, used by the shell to request a command from the user.
PS2 Secondary prompt, used to request additional info from the user.
PS3 3rd prompt (rarely used).
PS4 4th prompt (rarely used).