| 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 |