home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam  

UNIX in a Nutshell: System V Edition

UNIX in a Nutshell: System V EditionSearch this book
Previous: 5.2 Syntax Chapter 5
The C Shell
Next: 5.4 Expressions

5.3 Variables

This subsection describes the following:

  • Variable substitution

  • Variable modifiers

  • Predefined shell variables

  • Example .cshrc file

  • Environment variables

5.3.1 Variable Substitution

In the following substitutions, braces ( {} ) are optional, except when needed to separate a variable name from following characters that would otherwise be a part of it.

${ var } The value of variable var .
${ var [ i ]}

Select word or words in position i of var . i can be a single number, a range m - n , a range - n (missing m implies 1), a range m - (missing n implies all remaining words), or * (select all words). i can also be a variable that expands to one of these values.

${# var } The number of words in var .
${#argv} The number of arguments.
$0 Name of the program.
${#argv[ n ]}

Individual arguments on command line (positional parameters). n = 1-9.

${ n } Same as ${argv[ n ]} .
${#argv[*]} All arguments on command line.
$* Same as $argv[*] .
$argv[$#argv] The last argument.
${? var } Return 1 if var is set; 0 if var is not set.

Process number of current shell; useful as part of a filename for creating temporary files with unique names.

$?0 Return 1 if input filename is known; 0 if not.
$< Read a line from standard input. Examples

Sort the third through last arguments (files) and save the output in a unique temporary file:

sort $argv[3-] > tmp.$$

Process .cshrc commands only if the shell is interactive (i.e., the prompt variable must be set).

if ($?prompt) then
set commands,

alias commands,



5.3.2 Variable Modifiers

Except for $? var , $$ , $?0 , and $< , the variable substitutions above may be followed by one of these modifiers. When braces are used, the modifier goes inside them.


Return the variable's root.


Return the variable's extension.


Return the variable's header.


Return the variable's tail.


Return all roots.


Return all extensions.


Return all headers.


Return all tails.


Quote a wordlist variable, keeping the items separate. Useful when the variable contains filename metacharacters that should not be expanded.


Quote a pattern, expanding it into a wordlist. Examples Using Pathname Modifiers

The table below shows the use of pathname modifiers on the following variable:

aa=(/progs/num.c /book/chap.ps)

Variable Portion Specification Output Result
Normal Variable echo $aa /progs/num.c /book/chap.ps
Second Root echo $aa[2]:r /book/chap
Second Header echo $aa[2]:h /book
Second Tail echo $aa[2]:t chap.ps
Second Extension echo $aa[2]:e ps
Root echo $aa:r /progs/num /book/chap.ps
Global Root echo $aa:gr /progs/num /book/chap
Header echo $aa:h /progs /book/chap.ps
Global Header echo $aa:gh /progs /book
Tail echo $aa:t num.c /book/chap.ps
Global Tail echo $aa:gt num.c chap.ps
Extension echo $aa:e c /book/chap.ps
Global Extension echo $aa:ge c ps Examples Using Quoting Modifiers


set a="[a-z]*" A="[A-Z]*"


echo "$a" "$A"

[a-z]* [A-Z]*


echo $a $A

at cc m4 Book Doc


echo $a:x $A

[a-z]* Book Doc


set d=($a:q $A:q)


echo $d

at cc m4 Book Doc


echo $d:q

[a-z]* [A-Z]*


echo $d[1] +++ $d[2]

at cc m4 +++ Book Doc


echo $d[1]:q


5.3.3 Predefined Shell Variables

Variables can be set in one of two ways, by assigning a value:





or by simply turning them on:



In the table below, variables that accept values are shown with the equal sign followed by the type of value they accept; the value is then described. (Note, however, that variables such as argv , cwd , or status are never explicitly assigned.) For variables that are turned on or off, the table describes what they do when set. The C shell automatically sets the variables argv , cwd , home , path , prompt , shell , status , term , and user .

argv=( args )

List of arguments passed to current command; default is () .

cdpath=( dirs )

List of alternate directories to search when locating arguments for cd , popd , or pushd .

cwd= dir Full pathname of current directory.

Re-display each command line before execution; same as csh -x command.

fignore=( chars )

List of filename suffixes to ignore during filename completion (see filec ).


If set, a filename that is partially-typed on the command line can be expanded to its full name when ESC is pressed. If more than one filename would match, type EOF to list possible completions.


Tell dirs to display the actual pathname of any directory that is a symbolic link.

histchars= ab

A two-character string that sets the characters to use in history-substitution and quick-substitution (default is !^).

history= n

Number of commands to save in history list.

home= dir

Home directory of user, initialized from HOME. The ~ character is shorthand for this value.


Ignore an end-of-file ( EOF ) from terminals; prevents accidental logout.

mail=( n file )

One or more files checked for new mail every 5 minutes or (if n is supplied) every n seconds.


Don't ring bell for ambiguous file completion (see filec ).


Don't redirect output to an existing file; prevents accidental destruction of files.


Turn off filename expansion; useful in shell scripts.


Treat filename metacharacters as literal characters; e.g., vi  ch * creates new file ch * instead of printing ``No match."


Notify user of completed jobs right away, instead of waiting for the next prompt.

path=( dirs )

List of pathnames in which to search for commands to execute. Initialized from PATH; default is ( . /usr/ucb /usr/bin ) .

prompt=' str '

String that prompts for interactive input; default is % .

savehist= n

Number of history commands to save in ~/.history upon logout; they can be accessed at the next login.

shell= file

Pathname of the shell program currently in use; default is /bin/csh .

status= n

Exit status of last command. Built-in commands return 0 (success) or 1 (failure).

term= ID

Name of terminal type, initialized to /etc/ttytype ; same as TERM.

time=' n % c '

If command execution takes more than n CPU seconds, report user time, system time, elapsed time, and CPU percentage. Supply optional % c flags to show other data.

user= name

Login name of user, initialized from USER.


Display a command after history substitution; same as the command csh -v .

5.3.4 Example .cshrc File

set path=(~ ~/bin /usr/ucb /bin /usr/bin . )
set mail=(/usr/mail/tom)

if ($?prompt) then           # settings for interactive use
  set echo
  set filec
  set noclobber ignoreeof

  set cdpath=(/usr/lib /usr/spool/uucp)
# Now I can type cd macros
# instead of cd /usr/lib/macros

  set fignore=.o             # ignore object files for filec
  set history=100 savehist=25
  set prompt='tom \!% '      # includes history number
  set time=3


  set man1="/usr/man/man1"     # lets me do   cd $man1, ls $man1
  set a="[a-z]*"               # lets me do   vi $a
  set A="[A-Z]*"               # or           grep string $A


  alias c "clear; dirs"        # use quotes to protect ; or |
  alias h "history|more"
  alias j jobs -l
  alias ls ls -sFC             # redefine ls command
  alias del 'mv \!* ~/tmp_dir' # a safe alternative to rm

5.3.5 Environment Variables

The C shell maintains a set of environment variables , which are distinct from shell variables and aren't really part of the C shell. Shell variables are meaningful only within the current shell, but environment variables are automatically exported, making them available globally. For example, C shell variables are accessible only to a particular script in which they're defined, whereas environment variables can be used by any shell scripts, mail utilities, or editors you might invoke.

Environment variables are assigned as follows:





By convention, environment variable names are all uppercase. You can create your own environment variables, or you can use the predefined environment variables below.

These environment variables have a corresponding C shell variable. When either one changes, the value is copied to the other:


Home directory; same as home .


Search path for commands; same as path .


Terminal type; same as term .


User name; same as user .

Other environment variables include the following:


A string of ex commands similar to those found in the startup .exrc file (e.g., set ai ). Used by vi and ex.


Another name for the USER variable.


The file that holds mail. Used by mail programs. This is not the same as the C shell mail variable, which only checks for new mail.


The current directory; the value is copied from cwd .


Undefined by default; once initialized to shell , the two are identical.


The file that holds the cursor-positioning codes for your terminal type. Default is /etc/termcap .

Previous: 5.2 Syntax UNIX in a Nutshell: System V Edition Next: 5.4 Expressions
5.2 Syntax Book Index 5.4 Expressions

The UNIX CD Bookshelf Navigation The UNIX CD BookshelfUNIX Power ToolsUNIX in a NutshellLearning the vi Editorsed & awkLearning the Korn ShellLearning the UNIX Operating System