1

bashスクリプトbをスクリプトaでラップしようとしています。ただし、aに渡されたオプションもbにもそのまま渡したいです。

#!/bin/bash

# script a
./b ${@:$OPTIND}

これにより、$1 (存在する場合) も出力されます。そうしない最も簡単な方法は何ですか?

だから呼び出す:

./a -c -d 5 first-arg

b を実行したい: ./b -c -d 5 # 最初の引数なし

4

3 に答える 3

1
于 2011-04-29T19:49:52.383 に答える
0

コマンド オプションを通常の引数から分離するには、どのオプションが引数を取り、どのオプションが独立しているかを知る必要があります。
コマンド例では:

./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 までが、個別の単語として渡される」ことを意味します。

于 2011-04-29T21:26:55.670 に答える
0

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を使用している場合にのみ使用されますgetoptsgetoptsでパラメータを処理した回数をカウントします$@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

于 2011-04-29T16:37:41.730 に答える