10. tc Shell (Part 1)

tc Shell

Introduction

  • The tcsh is a new version of the C shell, which originated from Unix BSD
  • The C shell and tcsh base much of their syntax on the C language
  • From the beginning, the Bourne shell and the C shell have had different features and syntax
  • However bash and tcsh now share many of the same features and their syntax are more similar, but there is a bigger difference between bash and tcsh than bash and ksh
  • In this note, we discuss the differences between tcsh and bash

Running the TC Shell

  • tcsh can be the default login shell, just like bash or ksh
  • The default tcsh prompt (stored in a variable called prompt) is: $
  • From any shell, to start tcsh: tcsh
  • To check where tcsh is in the system: whereis tcsh
    • Normally tcsh is at: /bin/tcsh
  • If tcsh is started as a child process of another shell, to get back to the original shell, use: exit
  • To find the current shell that is running: echo $0

Input / Output

  • To print to screen, use echo (just as with bash)
  • To read from the input stream, use set and $<
  • An example script:

#!/bin/tcsh

echo -n "Your name: "

set name = "$<" # read input line into name

echo “hello $name” # print name

  • Just like with any other shell, tcsh script also accepts command line arguments and options
  • Command line arguments are accessed through the positional parameters(see discussion of positional variables in slide 7)
  • We can also use redirection of both input and output of the shell
  • Redirection of error is not possible without also redirection of output A common way to redirect error is:

( command > outputfile ) >& errfile

  • We can also use command substitutions and pipes for input and output. Command substitutions typically use the ` ` (back ticks) format.

User Defined Variables

  • There are 2 ways to create and initialize variables, depending on whether the data is a string or a number
  • Create and initialize string variables with set
  • Format: set varName = value
    • where space before and after the = is okay
    • For example: set class = “cis18c”
  • Due to the fickle nature of the tcsh parser, always quote strings and string variables, especially if the string has space and punctuation characters
  • Create and initialize numeric variables with @
  • Format: @ varName = value

where space before and after the = is okay

and there is a space between @ and the variable name

For example: @ num = 10

  • $?varName returns 1 if variable is set, 0 if variable is undefined

Arrays

  • Create and initialize arrays with set and ( )
  • Format: set arrayName = (val1 val2 val3)
  • Array elements are accessed by using [ ] but indexing starts at 1, not 0
  • Multiple index values or * can be put in between [ ] to access multiple elements at a time
  • Example: set colors = (red orange yellow green blue)

echo $colors[1] print: red

echo $colors[2-4] print: orange yellow green

echo $colors[*] print all elements

  • Note: there is no space when using index values inside [ ]

echo $colors[1] is okay, but echo $colors[ 1 ] is not okay

  • $arrayName refers to the entire array
  • $#arrayName returns the number of elements in an array
  • shift arrayName shifts left the elements of the array and the array is shorter by one

Shell Variables

  • Command line arguments are in positional variables ($0, $1, $2, $*) but there is no $@
  • There is no getopts function that can be used for option validation
  • Following the tradition of the C language, command line options and arguments are also stored in the argv array, and this is the common way to access them in a tcsh script

$argv[1] first input argument

$argv[2] second input argument

$argv[n] nth input argument

$argv entire list of arguments

$#argv number of input arguments

  • Process ID is stored in the variable $, just as in bash
  • Exit status is stored in the variable status or ?

Environment Variables

  • System environment variables:
  • Some environment variables can be in lowercase
  • Some common environment variables:

prompt primary shell prompt

home or HOME home directory

path or PATH search path

user or USER user id

shell current shell

0 current shell

Expressions

  • Arithmetic expressions
    • Operators are similar to bash: +, -, *, /, +=, /= , ++…
    • For the shell to evaluate the expression, the expression must begin with @
    • For example: @ num = 2 * $var num is 2 times var

or @ count++ count is incremented by 1

  • Logical expressions
    • Operators are similar to bash: !, &&, ||
  • Relational expressions
    • Operators are similar to bash: <, >, <=, >=, !=, ==
    • These logical operators apply to string comparison as well as numeric comparison. Depending on the data in the variables, the operation can be a string compare or a numeric compare
    • When using == or != with strings, the operator requires an exact match

String matching

  • Strings can also be partially matched with the operators
    • =~ (for match) and !~ (for not match)
  • The right side of =~ and !~ are wildcards, not regex
  • In other words, the match works the same way as how the shell matches wildcards on the command line
  • Example: “$str” =~ “cis*”
    • will match if $str starts with cis, followed by 0 or more characters
  • File tests are similar to bash:

-e exist -r read access

-z zero length -w write access

-f regular file -x execute access

-d directory

-l link