bashスクリプトbをスクリプトaでラップしようとしています。ただし、aに渡されたオプションもbにもそのまま渡したいです。
#!/bin/bash
# script a
./b ${@:$OPTIND}
これにより、$1 (存在する場合) も出力されます。そうしない最も簡単な方法は何ですか?
だから呼び出す:
./a -c -d 5 first-arg
b を実行したい: ./b -c -d 5 # 最初の引数なし
bashスクリプトbをスクリプトaでラップしようとしています。ただし、aに渡されたオプションもbにもそのまま渡したいです。
#!/bin/bash
# script a
./b ${@:$OPTIND}
これにより、$1 (存在する場合) も出力されます。そうしない最も簡単な方法は何ですか?
だから呼び出す:
./a -c -d 5 first-arg
b を実行したい: ./b -c -d 5 # 最初の引数なし
コマンド オプションを通常の引数から分離するには、どのオプションが引数を取り、どのオプションが独立しているかを知る必要があります。
コマンド例では:
./a -c -d 5 first-arg
-c
-d
スタンドアロンのオプションと5 first-arg
通常の引数の場合があります5
オプションへの引数である可能性があり-d
ます(これはあなたが意味しているようです)-d
-c
オプションの引数であり、(最初のケースのように)5 first-arg
通常の引数である可能性があります。-a
、-b
、-c
および-d
が唯一のオプションであり、それ-b
が-d
オプション引数を取る唯一のものであると仮定して、これを処理する方法を次に示します。オプションがどこで終了するかを把握するには、すべてのオプションを解析する必要があることに注意してください。
#!/bin/bash
while getopts ab:cd: OPT; do
case "$OPT" in
a|b|c|d) : ;; # Don't do anything, we're just here for the parsing
?) echo "Usage: $0 [-ac] [-b something] [-d something] [args...]" >&2
exit 1 ;;
esac
done
./b "${@:1:$((OPTIND-1))}"
ループ全体while
は、OPTIND を計算するためだけに存在します。コマンドのはab:cd:
、getopts
許可されるオプションと引数を取るオプション (コロンで示されます) を定義します。不可解な最終式は、「引数配列の要素 1 から OPTIND-1 までが、個別の単語として渡される」ことを意味します。
or${@:$OPTIND}
だけでなく andを使用しているのはなぜですか?$@
$*
構文はparse${parameter:index}
に使用するように言います。を使用している場合は、パラメーターへのインデックスとして使用されます。index
$parameter
$@
index
$ set one two three four #Sets "$@"
$ echo $@
one two three four
$ echo ${@:0}
one two three four
$ echo ${@:1}
one two three four
$ echo ${@:2}
two three four
$OPTIND
を使用している場合にのみ使用されますgetopts
。getopts
でパラメータを処理した回数をカウントします$@
。bashマンページによると:
OPTIND は、シェルまたはシェル スクリプトが呼び出されるたびに 1 に初期化されます。
これは、常に の値を取得している理由を説明している可能性があります1
。
@David - "./b $@ " は、a に渡された引数を出力します (Q edit を参照)。引数ではなく a のオプションのみを渡したい
だから、私が実行した場合:
$ a -a foo -b bar -c fubar barfu barbar
bに渡したい:
$ b -a foo -b bar -c fubar
だがしかし
$ b -arg1 foo -arg2 bar -arg3 fubar barfu barbar
それは難しいでしょう...
b
行全体を渡して無視することができない理由はありますか?
正規表現を使用できる可能性があると思います:
$ echo "-a bar -b foo -c barfoo foobar" | sed 's/\(-[a-z] [^- ][^- ]*\) *\([^-][^-]*\)$/\1/'
-a bar -b foo -c barfoo
この正規表現がすべての状況で機能することを保証することはできません (つまり、パラメーターがない場合はどうなるでしょうか?)。基本的に、私はそれを行末に固定してから、最後のパラメーターと引数、および行の残りの部分を照合します。最後のパラメーターと引数だけで置き換えます。
いくつかの状況でテストしましたが、 を使用getopts
して引数を取得し、それを自分自身に渡すか、可能であればそれらの余分な引数b
を単に無視する方がよい場合があります。b