Previous Table of Contents Next

Module 120


The internal shift command reassigns the positional parameters to the next lower positional number. It allows you to left shift your positional parameters. Left shifting the positional parameters causes parameter n to become n-1. For example, if you type echo $2 and then perform a shift, you can display the same value again by typing echo $1. The $2 parameter was shifted left one position to $1. The $0 parameter is not shifted because it is not considered a positional parameter.


Following is the general format of the shift command.

     shift [ n ]


The following describes the argument that may be passed to the shift command.

n The number of positions to shift the parameters.
If no n is given then shift assumes the value of 1.


Normally the shift command shifts parameters left by one position. But you can specify a number or a variable containing a number to shift multiple positions. The following example shows how the shift command affects the positional parameters. Use the set command to set positional parameters for your current shell. The first command is equivalent to executing a shell script and passing it the 12 positional parameters.

      cj> set - pp1 pp2 pp3 pp4 pp5 pp6 pp7 pp8 pp9 pp10 pp11 pp12
      cj> echo "$#: $*
      12: pp1 pp2 pp3 pp4 pp5 pp6 pp7 pp8 pp9 pp10 pp11 pp12

      cj> echo ${11} ${7} ${3} ${1}
      pp11 pp7 pp3 pp1

      cj> shift
      cj> echo "$#: $*"
      11: pp2 pp3 pp4 pp5 pp6 pp7 pp8 pp9 pp10 pp11 pp12

      cj> shift 8
      cj> echo "$#: $*"
      3: pp10 pp11 pp12

      cj> echo $1 $3
      pp10 pp12

      cj> shift 3
      cj> echo "$#: $*"

The Korn shell added the feature to reference positional parameters higher than nine. The Bourne shell can only reference up to nine positional parameters; therefore, you were forced to use the shift command to access any parameters in positions greater than nine.


If you attempt to shift parameters when there are none to shift, you will receive an error message from the shell resembling:

      ksh: prog: cannot shift


Refer to the ksh command described in Module 71 and Parameters and Variables discussed in Module 99.


The shift command provides you a method of processing the positional parameters. If you are writing shell scripts, you may want to reassign your positional parameters to known variable names. By using the shift command in combination with a while loop and case statement, you can step through all the positional parameters, reassigning them as needed.


In this activity you use the shift command to process positional parameters in a while loop. Begin at the shell prompt.

1.  Type the following lines, pressing Return at the end of each line. You may want to store this in a file for later reference.
   cj> set - -x -y -z 30 afile myfile
   cj> while [ $# -gt 0 ]   # when there are no more arguments stop loop
   case $1 in
    -x) XFLAG="yes" ;;
    -y) YFLAG="yes" ;;
    -z) ZFLAG=$2    ; shift ;; # shift once here for the -z
     *) FILES="${FILES} "$1 ;;
   shift  # shift the first positional parameter off the argument list.
   echo "${XFLAG} ${YFLAG} ${ZFLAG} ${FILES}"

C Shell
   cj> set XFLAG; set YFLAG; set ZFLAG; set FILES
   cj> set argv=(-x -y -z 30 afile myfile)
   cj> while ($#argv > 0)
   switch ($argv[1])
    case -x:
     set XFLAG="yes"
    case -y:
     set YFLAG="yes"
    case -z:
     set ZFLAG=$argv[2]; shift
     set FILES="$FILES $argv[1]"

The output looks like this.
    yes yes 30 afile myfile

If you are using the ksh you can edit the code by pressing Escape and typing k. Repeat typing a k until the while appears on your command line; press v to enter vi to edit the file. When you finish editing the file type ZZ and the command is executed again.
2.  Turn to Module 121 to continue the learning sequence.

Previous Table of Contents Next