#!/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
如果我执行它,对于$dir
,我会得到2 testDir
,而对于$it
,我会得到0
,而不是期望的只有testDir
和2
。如何获得期望的结果?
./test.sh -pi 2 testDir
true 0 2 testDir
bash -x ./test.sh
以查看脚本正在做什么。if
块看起来非常奇怪:它的意思是如果有一个非空的非选项参数,那么将dir
设置为对非选项参数执行路径名扩展和单词拆分的结果,并用空格连接它们。(很复杂,是吧?)我怀疑你的意思是if [[ ${!OPTIND} != "" ]]; then dir=${!OPTIND}; fi
。通常的方法甚至更简单:在解析选项后运行shift $OPTIND
,这样非选项参数就是$1
、$2
等,因此if [[ -n $1 ]]; then dir=$1; fi
。 - Gilles 'SO- stop being evil'