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. 29set temp=(`getopt -s tcsh -o ab:c:: --long a-long,b-long:,c-long:: -- $argv:q`) 30if ($? != 0) then 31 echo "Terminating..." >/dev/stderr 32 exit 1 33endif 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. 38eval set argv=\($temp:q\) 39 40while (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 69end 70 71echo "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: 74while ($#argv > 0) 75 echo '--> '\`$1:q\' 76 shift 77end 78