2017-10-23 15 views
0

を識別することができない:getoptsは:これは私が試したスクリプトで引数

#!/bin/bash 
while getopts ":u:p:" option; do 
     case $option in 
       u) USER=$OPTARG;; 
       p) PASS=$OPTARG;; 
       \?) echo "Invalid Option: $OPTARG" 
        exit 1;; 
       :) echo "Please provide an argument for $OPTARG!" 
        exit 1;; 
     esac 
done 
echo "Username/Password: $USER/$PASS" 

スクリプトを実行するためのコマンドである場合:

./test9.sh -u test -p -a 

その後、私は出力を取得しています:

Username/Password: test/-a 

-aは無効な引数ですが、スクリプトはパスワードとして-aを使用しています。私はメッセージPlease enter a passwordを表示し、スクリプトを終了したいと思います。これを修正する際に私を助けてください。

答えて

1

パラメータには、オプション、オプション引数、および位置パラメータの3種類があります。パラメータが引数を必要とするオプションである場合、次のパラメータは何があっても引数として扱われます。ダッシュで始まるか、有効なオプションと一致する場合もありますが、引き続きオプションの引数として扱われます。

プログラムがダッシュで始まる引数を拒否したい場合は、自分でプログラムする必要があります。ダッシュで始まるパスワードは完全に合法です。パスワードをチェックするプログラムはそれらを拒否してはいけません。

オプションの引数を受け入れるオプションは、非常に混乱し、非標準です。 Getoptは一般的にGetoptをサポートしていません。そのためのGNU拡張はありますが、それを使用しないでください。

TL; DR修正するものは何もありません。スクリプトは問題ありません。

0

私はあなたのスクリプトをテストしていませんが、の代わりにgetoptsを使用すると、-aは有効なオプションではないため、エラーが発生します。

関連する問題