Shell: "Can't Shift That Many" Error

Shell: "Can't Shift That Many" Error

The following script works fine in one of my machines, printing 1 then 2:

#!/bin/sh

echo "1"
shift
echo "2"

On another machine, however, it produces the following output:

1
./script.sh: 4: shift: can't shift that many

man shift does not help (No manual entry for shift).

What is that error, why is it happening, and how can I fix it?

1 Answer

What is shift: it is a shell built-in that works as follows (adapted from TLDP):

The shift command takes one argument, a number (if not present, it is assumed to be 1). The positional parameters (e.g. command arguments) are shifted to the left by this number, N. The positional parameters from N+1 to $# are renamed to variable names from $1 to $# - N+1.

Often you make a loop in which you process one or more arguments, then you call shift to "forget" them and loop again to process the following ones.

Error cause: The error comes from the fact that some shells (but not all) detect when there are not enough arguments for shift. In particular, dash considers it a fatal error.

Possible solutions:

  • Test if there are enough remaining arguments: if [ "$#" -gt 0 ]; then shift; fi

  • Add a conditional argument: shift $(( $# > 0 ? 1 : 0 ))

3

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

David Miller
Author

David Miller

David Miller brings 15 years of experience in global economics, personal finance strategy, and market dynamics. He specializes in turning complex economic trends into actionable insights for everyday readers.