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