Subject: How do I find the last argument in a Bourne shell script? Date: Thu Mar 18 17:16:55 EST 1993
eval last=¥${$#}POSIX にコンパチブルなシェルなら、引数の数がいくつでも使用できます。 次に示すのも常に使用できます。
for last do : done上記のは次のように一般化できます。
for i do third_last=$second_last second_last=$last last=$i doneさて、あなたがリストから最後の引数を削除したい、または引数リストを逆順 にしたい、任意の N に対して N 番めの引数を直接操作したい、とします。こ れがそれらを行なうの方法の基礎で、サブプロセスの作成をしないでシェル組 み込み機能だけを使います。
t0= u0= rest='1 2 3 4 5 6 7 8 9' argv= for h in '' $rest do for t in "$t0" $rest do for u in $u0 $rest do case $# in 0) break 3 esac eval argv$h$t$u=¥$1 argv="$argv ¥"¥$argv$h$t$u¥"" # (1) shift done u0=0 done t0=0 done # ここで引数を設定し直す eval set x "$argv" # (2) shiftこの例は最初の 999 個の引数に働きます。十分でしょうか。
(1), (2) と印をつけた行を良く見て下さい。そしてどんな変な文字が含まれ ていても、確かに元の引数が取り戻せていることを自分自身で納得して下さい。
N 番めの引数を見つける場合には、これを使います。
eval argN=¥$argv$N引数を逆順にするのなら (1) と印をつけた行をこう変えなければなりません。
argv="¥"¥$argv$h$t$u¥" $argv"最後の引数を取り除く方法は、練習として残しておきます。
サブプロセスを使うのと、外部コマンドを使うのも許すとしたら、変数 'argvN' はもっと簡単に設定できます。
N=1 for i do eval argv$N=¥$i N=`expr $N + 1` done引数を逆順にするための、より簡単な方法があります。サブプロセスさえ作り ません。この方法は例えば最後の引数を削除したい時にも使えます。しかし、 この場合、'argvN' 変数は逆順に設定されるとで、N 番めの引数を直接参照す ることはできなくなります。
argv= for i do eval argv$#=¥$i argv="¥"¥$argv$#¥" $argv" shift done eval set x "$argv" shift