2017-09-21 12 views
0

私はgetoptsと位置パラメータの両方を使用したいが、プログラムに位置パラメータを渡すと、getoptsが失われる。私はこのようなプログラムの実行時にbashでgetoptsと位置パラメータを組み合わせる方法は?

directory=$1 

while getopts l: flag; do 
    case "$flag" in 
    l) level=$OPTARG;; 
    esac 
done 

if [ -n "$level" ]; then 
    echo "Level exist!" 
else 
    echo "Level doesn't exist!" 
fi 

だから:

Level exist!

を、代わりにそれが返されます:

sh myprogram.sh ~/documents -l 2 

を私は期待し

Level doesn't exist!

ことがあるのはなぜ

Level exist!

sh myprogram.sh -l 2

私は正しい出力を得る:

事は、私はこのような位置パラメータ(〜/書類)せずにプログラムを実行する場合、あります?位置のパラメータとgetoptsの両方をbashで使用するにはどうすればよいですか?

ありがとうございます!

+0

を発見された場合にgetoptsが停止します代入 'directory = $ 1'の後に' shift'を使ってください。しかし、指摘されているように、確立された習慣に従うだけのほうがよいでしょう。 –

答えて

2

ほとんどのツールは、次の形式で書かれています:tool [options] arg ...

だから、あなたがこれを行うだろう:\?

# first, parse the options: 
while getopts l: flag; do 
    case "$flag" in 
    l) level=$OPTARG;; 
    \?) exit 42;; 
    esac 
done 

# and shift them away 
shift $((OPTIND - 1)) 

# validation 
if [ -n "$level" ]; then 
    echo "Level exist!" 
else 
    echo "Level doesn't exist!" 
fi 

# THEN, access the positional params 
echo "there are $# positional params remaining" 
for ((i=1; i<=$#; i++)); do 
    printf "%d\t%s\n" $i "${!i}" 
done 

を使用し、スクリプトを中止するために、ユーザが未知のオプションを提供し、または必要を提供するために、失敗した場合引数

など、それを呼び出す:

$ bash test.sh 
Level doesn't exist! 
there are 0 positional params remaining 

$ bash test.sh -l 2 
Level exist! 
there are 0 positional params remaining 

$ bash test.sh -l 2 foo bar 
Level exist! 
there are 2 positional params remaining 
1 foo 
2 bar 

$ bash test.sh -x 
test.sh: illegal option -- x 

$ bash test.sh -l 
test.sh: option requires an argument -- l 

しかし、あなたは、引数の後にオプションを置くことはできません。あなたが最初の位置パラメータをすることができます、あなたのディレクトリになるだろうされていることを確認するために知っている場合は最初の非オプション引数が

$ bash test.sh foo bar -l 2 
Level doesn't exist! 
there are 4 positional params remaining 
1 foo 
2 bar 
3 -l 
4 2 
+0

ニース!それはうまくいったので、パラメータの後にオプションを入れるための回避策はありませんか? – bntzio

+0

'getopts'ではありません。それを行うことができる外部プログラム呼び出し 'getopt'があります。作業するのが少し難しいです。次に例を示します:https://bazaar.launchpad.net/~ubuntu-branches/ubuntu/vivid/util-linux/vivid/view/head:/misc-utils/getopt-parse.bash –

関連する問題