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