Bash関数内でgetoptsを使用する 質問する

Bash関数内でgetoptsを使用する 質問する

getopts.bash_profile で定義した関数内で使用したいと思います。アイデアとしては、この関数にいくつかのフラグを渡して動作を変更したいということです。

コードは次のとおりです:

function t() {
    echo $*
    getopts "a:" OPTION
    echo $OPTION
    echo $OPTARG
}

次のように呼び出すと:

t -a bc

次のような出力が得られます:

-a bc
?
 

bc何が問題なのでしょうか?手動でシフトしたり解析したりせずに値を取得したいのですが、getopts関数内で正しく使用するにはどうすればよいでしょうか?

編集: $OPTARG を試すようにコード スニペットを修正しましたが、効果はありませんでした。

編集 #2: コードは問題ないことがわかりました。シェルが何らかの理由でおかしくなっていました。新しいウィンドウを開くと解決しました。引数の値は確かに $OPTARG にありました。

ベストアンサー1

@Ansgar が指摘しているように、オプションの引数は に格納されます${OPTARG}が、関数内で使用するときに注意すべきことはこれだけではありません。を設定解除するか で宣言して、 が関数に対してローカルであるgetoptsことを確認する必要もあります。そうしないと、関数を複数回呼び出すときに予期しない動作が発生します。${OPTIND}local

t.sh:

#!/bin/bash

foo()
{
    foo_usage() { echo "foo: [-a <arg>]" 1>&2; exit; }

    local OPTIND o a
    while getopts ":a:" o; do
        case "${o}" in
            a)
                a="${OPTARG}"
                ;;
            *)
                foo_usage
                ;;
        esac
    done
    shift $((OPTIND-1))

    echo "a: [${a}], non-option arguments: $*"
}

foo
foo -a bc bar quux
foo -x

実行例:

$ ./t.sh
a: [], non-option arguments:
a: [bc], non-option arguments: bar quux
foo: [-a <arg>]

をコメントアウトすると# local OPTIND、代わりに次のようになります。

$ ./t.sh
a: [], non-option arguments:
a: [bc], non-option arguments: bar quux
a: [bc], non-option arguments:

それ以外は、関数外で使用する場合と使い方は同じです。

おすすめ記事