2011-07-16 6 views
4
#!/bin/bash 

priority=false 
it=0 
dir=/ 

while getopts "p:i" option 
do 
    case $option in 
     i) it=$OPTARG;; 
     p) priority=true;; 
    esac 
done 

if [[ ${@:$OPTIND} != "" ]] 
then 
    dir=${@:$OPTIND} 
fi 
echo $priority $it $dir 

私はそれを実行した場合、私だけではなく、testDir$dir$itため2ための、$dir$itため0ため2 testDirを取得します。期待される行動をどうやって得ることができますか?最初の引数をgetoptsの引数とどのように区別しますか?

./test.sh -pi 2 testDir 
true 0 2 testDir 
+0

を? – sdolgy

+0

http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash –

+0

'bash -x。/ test.sh'を実行して、スクリプトが何をしているのかを確認します。 'if'ブロックは本当に奇妙に見えます:非空でない非オプション引数がある場合、非オプション引数でパス名展開と単語分割を行い、それらを空白で連結した結果に' dir'を設定します。 (複雑で、ええ?)あなたが '[$ {!OPTIND}!=" "]]を意味すると思う。次にdir = $ {!OPTIND}; fi'。通常の方法はもっと簡単です:オプションを解析した後に 'shift $ OPTIND'を実行して、オプションでない引数が' $ 1'、 '$ 2'などとなるようにします。そうすれば' [[-n $ 1]];次にdir = $ 1; fi'。 – Gilles

答えて

1

getoptsのoptstringパラメータが間違っているようです。 p:iがあり、希望するものはpi:なので、-iスイッチが引数を取るようにします。

2

私はこの記述します。あなたはTESTDIR -p 2 -iを使用する場合は、あなたが望む行動を得るのですか

#!/bin/bash 

priority=false 
it=0 

while getopts ":hpi:" opt; do 
    case "$opt" in 
     h) echo "usage: $0 ...."; exit 0 ;; 
     p) priority=true ;; 
     i) it="$OPTARG" ;; 
     *) echo "error: invalid option -$OPTARG"; exit 1 ;; 
    esac 
done 

shift $((OPTIND - 1)) 

dir="${1:-/}" 

echo "priority=$priority" 
echo "it=$it" 
echo "dir=$dir" 
関連する問題