0

getopts を使用し、特定のフラグに引数を指定しない場合は常に、次のメッセージが表示されます。"option requires an argument -- d"

このメッセージを削除し、ユーザーがreadコマンドを使用してオプションを再入力できるようにしたいと考えています。

getopts での私の場合は次のとおりです。

if [ $# -lt $OPTIND ]; then
    echo "Option -d argument missing: needs 2 args"
    echo "Please enter two args: <arg1> <arg2>"
    read d_ID d_SIZE
    echo "disc $d_ID $d_SIZE" >> $FILENAME
else
    d_ID=$OPTARG
    eval d_SIZE=\$$OPTIND
    echo "disc $d_ID $d_SIZE" >> $FILENAME
fi
;;
4

1 に答える 1

2

あなたが望む振る舞いは悪い考えだと思います。オプションの引数を持つオプションを取るプログラムが存在し、それらはあなたが説明したものとはまったく異なります。あなたのアプローチはユーザーを混乱させる可能性があります。他のプログラムとの相互運用が困難になります。また、スクリプトの将来の拡張性が制限されます。(後で別のオプションを追加したいと想像してみてください。ユーザーが引数なしで使用し、別のオプションとして意図していたとしても、引数としてyour_script.sh -d -eに渡されます。)そして、それがコマンドラインにある場合、1つの引数を期待するのは特に奇妙です、ただし、標準入力からの 2 つの引数。-e-d-d-e

それは言った。. .

オプションのオプション引数の効果の一部を実現するには、オプション文字列の先頭にgetoptsコロンを付けることで、「サイレント」であること (つまり、「サイレント エラー レポート」を使用すること)を伝えることができます。:(たとえば、代わりにgetopts d: ...を記述しgetopts :d: ...ます。) 次に、オプションの引数が欠落している場合、オプション名を:( の代わりにd) およびOPTARGオプション名 (つまりd、オプション引数の代わりに ) に設定します。

たとえば、次のスクリプトは asscript.sh -d fooまたは asscript.sh -dのいずれかで呼び出すことができ、後者を使用すると、ユーザーに値の入力を求めるプロンプトが表示されます。

#!/bin/bash

if getopts :d: arg ; then
    if [[ "$arg" == d ]] ; then
        d="$OPTARG"
    else
        read -p 'Enter d: ' d
    fi
    echo "d is: $d"
else
    echo 'no d'
fi

その結果:

$ ./script.sh
no d

$ ./script.sh -d
Enter d: x
d is: x

$ ./script.sh -d y
d is: y
于 2013-10-05T20:44:12.740 に答える