| 1 | 
#!/bin/tcsh | 
| 2 | 
 | 
| 3 | 
# A small example program for using the new getopt(1) program. | 
| 4 | 
# This program will only work with tcsh(1) | 
| 5 | 
# An similar program using the bash(1) script language can be found | 
| 6 | 
# as parse.bash | 
| 7 | 
 | 
| 8 | 
# Example input and output (from the tcsh prompt): | 
| 9 | 
# ./parse.tcsh -a par1 'another arg' --c-long 'wow\!*\?' -cmore -b " very long " | 
| 10 | 
# Option a | 
| 11 | 
# Option c, no argument | 
| 12 | 
# Option c, argument `more' | 
| 13 | 
# Option b, argument ` very long ' | 
| 14 | 
# Remaining arguments: | 
| 15 | 
# --> `par1' | 
| 16 | 
# --> `another arg' | 
| 17 | 
# --> `wow!*\?' | 
| 18 | 
 | 
| 19 | 
# Note that we had to escape the exclamation mark in the wow-argument. This | 
| 20 | 
# is _not_ a problem with getopt, but with the tcsh command parsing. If you | 
| 21 | 
# would give the same line from the bash prompt (ie. call ./parse.tcsh), | 
| 22 | 
# you could remove the exclamation mark. | 
| 23 | 
 | 
| 24 | 
# This is a bit tricky. We use a temp variable, to be able to check the | 
| 25 | 
# return value of getopt (eval nukes it). argv contains the command arguments | 
| 26 | 
# as a list. The ':q`  copies that list without doing any substitutions: | 
| 27 | 
# each element of argv becomes a separate argument for getopt. The braces | 
| 28 | 
# are needed because the result is also a list. | 
| 29 | 
set temp=(`getopt -s tcsh -o ab:c:: --long a-long,b-long:,c-long:: -- $argv:q`) | 
| 30 | 
if ($? != 0) then  | 
| 31 | 
  echo "Terminating..." >/dev/stderr | 
| 32 | 
  exit 1 | 
| 33 | 
endif | 
| 34 | 
 | 
| 35 | 
# Now we do the eval part. As the result is a list, we need braces. But they | 
| 36 | 
# must be quoted, because they must be evaluated when the eval is called. | 
| 37 | 
# The 'q` stops doing any silly substitutions. | 
| 38 | 
eval set argv=\($temp:q\) | 
| 39 | 
 | 
| 40 | 
while (1) | 
| 41 | 
        switch($1:q) | 
| 42 | 
        case -a: | 
| 43 | 
        case --a-long: | 
| 44 | 
                echo "Option a" ; shift  | 
| 45 | 
                breaksw; | 
| 46 | 
        case -b: | 
| 47 | 
        case --b-long: | 
| 48 | 
                echo "Option b, argument "\`$2:q\' ; shift ; shift | 
| 49 | 
                breaksw | 
| 50 | 
        case -c: | 
| 51 | 
        case --c-long: | 
| 52 | 
                # c has an optional argument. As we are in quoted mode, | 
| 53 | 
                # an empty parameter will be generated if its optional | 
| 54 | 
                # argument is not found. | 
| 55 | 
 | 
| 56 | 
                if ($2:q == "") then | 
| 57 | 
                        echo "Option c, no argument" | 
| 58 | 
                else | 
| 59 | 
                        echo "Option c, argument "\`$2:q\' | 
| 60 | 
                endif | 
| 61 | 
                shift; shift | 
| 62 | 
                breaksw | 
| 63 | 
        case --: | 
| 64 | 
                shift | 
| 65 | 
                break | 
| 66 | 
        default: | 
| 67 | 
                echo "Internal error!" ; exit 1 | 
| 68 | 
        endsw | 
| 69 | 
end | 
| 70 | 
 | 
| 71 | 
echo "Remaining arguments:" | 
| 72 | 
# foreach el ($argv:q) created problems for some tcsh-versions (at least | 
| 73 | 
# 6.02). So we use another shift-loop here: | 
| 74 | 
while ($#argv > 0) | 
| 75 | 
        echo '--> '\`$1:q\' | 
| 76 | 
        shift | 
| 77 | 
end |