Subject: How do I find the last argument in a Bourne shell script?
Date: Thu Mar 18 17:16:55 EST 1993

2.12) Bourne シェルで最後の引数を見つけるには、 どうすれば良いのですか。

もしも引数の数が最大でも9個だと確証があるなら、これが使えます。

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

UNIX FAQ LIST / Copyright(c)1994,Ted Timar / tmatimar@isgtec.com


Maintainer: あさだ たくや