【发布时间】:2011-10-06 15:07:32
【问题描述】:
#!/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
如果我执行它,我会得到2 testDir 对应$dir 和0 对应$it,而不仅仅是testDir 对应$dir 和2 对应$it。如何获得预期的行为?
./test.sh -pi 2 testDir
true 0 2 testDir
【问题讨论】:
-
如果你使用 -p 2 -i testDir 你会得到你想要的行为吗?
-
运行
bash -x ./test.sh以查看您的脚本在做什么。if块看起来很奇怪:这意味着如果有一个非空的非选项参数,则将dir设置为对非选项参数执行路径名扩展和分词并用空格连接它们的结果。 (很复杂,嗯?)我怀疑你的意思是if [[ ${!OPTIND} != "" ]]; then dir=${!OPTIND}; fi。常用的方法更简单:解析选项后运行shift $OPTIND,使得非选项参数为$1、$2等,即if [[ -n $1 ]]; then dir=$1; fi。
标签: bash parameter-passing command-line-arguments getopts