分类:
2008-05-10 18:21:21
Martin Weitzel <@mikros.systemware.de:martin@mwtech.uucp> Maarten Litmaath 提供的答案: 若你能确定参数不会超过九个的话,可用: eval last=\${$#} 在符合 POSIX 标准的 shell 里,不管有多少个参数都可用上述的方法。 底下方法是一定有用的: for last do : done 更一般性的做法是: for i do third_last=$second_last second_last=$last last=$i done 若你想做的是将最后一个参数去除或是将一堆参数的顺序反过来或是取用 第 N 个参数。底下是一个不用造出 subprocess 只用 shell 组建功能的 做法: 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 now restore the arguments val set x "$argv" # (2) hift 这个例子可以用到 999 个参数,应该够用了吧?仔细看看(1)与(2)标示的 地方,想办法说服你自己不管参数里面有什么奇怪的字元这两行都不会出 差错。 要找第 N 个参数,用: eval argN=\$argv$N 要将参数的顺序反过来,标示为(1)的那一行必须改成 argv="\"\$argv$h$t$u\" $argv" 自己练习最后一个参数去除的方法。 若允许呼叫外部指令这类造出 subprocess 的做法,代志就更好办了。 底下是找出 argvN: N=1 for i do eval argv$N=\$i N=`expr $N 1` done 要将参数的顺序反过来还有一个不用造出 subprocess,有更简单的方法。 这个方法也可以用来去除最后一个参数, 不过要注意的是 argvN 不在是 原来的第 N 个参数: argv= for i do eval argv$#=\$i argv="\"\$argv$#\" $argv" shift done eval set x "$argv" shift |