2017-11-01 11 views
0

フラグを持つユーザー名を取得する必要のあるbashスクリプトがあります。次に、-rまたは-wを探して、これを読んだり書いたりする。フラグの存在のみをテストするためのBashスクリプト

現在、私はget optsを使用していますが、実際の引数を-rと-wに渡す必要があります。

これらのフラグに何かを渡すことなく、-rまたは-wだけが存在するかどうかをテストするにはどうすればよいですか。

現在、私のスクリプトは次のようになります。

#!/bin/bash 
while getopts :u:r:w: opt; do 
    case $opt in 
    u) user="$OPTARG"      ;; 
    r) my_read=1       ;; 
    w) my_write=1       ;; 
    \?) echo "${0##*/}" [ -erw ]; exit 1  ;; 
    esac 
done 

if [[ ${my_write} -eq 1 ]] ; then 
    echo "write" 
fi 

if [[ ${my_read} -eq 1 ]] ; then 
    echo "read" 
fi 
+6

あなたのオプションが引数を取らないようにするには、それらの後に ':' sigilを使わないでください。あなたの現在のコードは*明示的に* '-r'を指示し、' -w'は 'OPTARG'に次の単語を入れます。 –

+0

ああ、私はそれが今問題だったと思う。 if文を変更して、そのフラグがコマンドラインで入力されたかどうかを確認するにはどうすればよいですか? –

+0

を参照してください。 https://stackoverflow.com/a/16496491/297323 '-z'はあなたの友人です –

答えて

2

、コロン(:)はキャラクターが必要と前のオプションを示し、引数。ただ、コロンを削除します。

#!/bin/bash 
while getopts u:rw opt; do 
    case $opt in 
    u) user="$OPTARG"      ;; 
    r) my_read=1       ;; 
    w) my_write=1       ;; 
    \?) echo "${0##*/} [ -erw ]" >&2; exit 1 ;; 
    esac 
done 
shift $((OPTIND-1)) 

if [[ "${my_write}" -eq 1 ]] ; then 
    echo "write" 
fi 

if [[ "${my_read}" -eq 1 ]] ; then 
    echo "read" 
fi 

作らその他の変更:最後の場合に引用符が不適切にパイプ避けるために、角括弧を含めるために、標準誤差(>&2)への出力を移動し、shiftラインがあなたの引数リストので、追加されました([email protected]$1など)は、getopts-parsedオプションを削除しており、引用符はテストの前後に置かれました。そうでないと、シェルは空のテストに合格すると文句を言います(-rまたは-wのいずれかの場合に、どちらの変数も未定義の場合は[[ -eq 1]]と表示されます)が渡されておらず、無効です。[[ "" -eq 1 ]]は単にfalseと評価されます)。

1

だけでパラメータでないオプションとしてそれらを得る:コメントで指摘したように

while [ -n "$1" ]; do 
case "$1" in 
    -r) echo "read";; 
    -w) echo "write";; 
esac 
shift 
done 
+1

'getopts'フリーの解析にもっと興味を持っている人には、[BashFAQ#35](http://mywiki.wooledge.org/BashFAQ/035)を参考にしてください。 –

関連する問題