シェルコマンド(「oldcommand」と呼びます)が与えられた場合、新しい「-location」オプションがあることを除いて、oldcommandと同じように動作する単純なシェルスクリプトnewcommand.shはありますか?
newcommand -location path -nonfileoption1 x1 -fileoption2 x2 -fileoption3 x3 -nonfileoption4 x4
実行されます
oldcommand -nonfileoption1 x1 -fileoption2 path/x2 -fileoption3 path/x3 -nonfileoption4 x4
ベストアンサー1
最初に1つのオプションにのみ興味があれば、これはほんの数行のスクリプトにすぎません。どこからでもオプションを解析して渡すには、数行のoldcommand
コードが必要で、どのオプションに値があり、どのオプションに値がないかを知る必要があります。
~のためシンプルケース、
#!/bin/sh
[ "$#" -gt 2 && "x$1" = "x-location" ] && cd $2 && shift 2 && exec oldcommand "$@"
newcommand "$@"
複雑な場合は、これを実行できるように聞こえますgetopt
(移植可能ではありません)。追加資料:
OPとの議論に基づいて問題を単純化するために使用できるパターンは次のとおりです。 "--fileopt"で始まるオプションには、位置オプションの値を前に追加する必要があります。したがって(代わりに実際のエラーチェックはありません。本物パス名に含まれる特殊文字の処理:
#!/bin/sh
PREP=
if [ "$#" -gt 2 ]
then
PREP="$2/"
shift 2
ARGS=
while [ "$#" != 0 ]
do
case "x$1" in
(x-fileopt*)
ARGS="$ARGS $1 ${PREP}$2"
shift 2
;;
(*)
ARGS="$ARGS $1"
shift 1
esac
done
oldcommand $ARGS
else
oldcommand "$@"
fi