我有一个bash脚本,我想这样调用:
bash curl.sh http://www.google.co.uk/ -d Directory -a "Moz 123" -r http://localhost/
我可以收集第一个参数(http://www.google.co.uk/),其中包含以下内容:
url=$1
while getopts p:d:a:r: opt; do
case $opt in
p) proxy=$OPTARG ;;
d) dir=$OPTARG ;;
a) ua=$OPTARG ;;
r) ref=$OPTARG ;;
esac
done
但是,它没有拿起其他参数。如果我删除'http://www.google.co.uk/'作为第一个参数,它会选择-arguments。
由于物流,我无法设置第一个参数,例如: 'http://www.google.co.uk/'与-u等。
你如何让这个工作?
答案 0 :(得分:3)
为什么不传入参数,用引号括起来?
e.g。
script.shl "http://www.google.com" "/var/www/test" "option 3"
...然后您可以使用$ 1 $ 2 $ 3直接在脚本中访问它们。您仍然可以通过使用if ... else?
来改变脚本的过程除非,我错误地读了你的问题......
答案 1 :(得分:1)
getopts
一看到不以连字符开头的参数就会停止解析。您必须更改传递参数的顺序,或使用外部getopt
程序的GNU版本,该程序可以处理与选项混合的常规参数。
我认为以下内容应该有效(它以您的代码和http://linuxaria.com/howto/parse-options-in-your-bash-script-with-getopt?lang=en上的示例为蓝本)。从本质上讲,getopt
只是重新排序参数并拆分任何组合选项(例如将-xyz
更改为-x -y -z
)。任何非可选参数都将在解析选项列表中的--
之后找到。
PARSED_OPTIONS=$( getopt -o "p:d:a:r:" -- "$@" )
eval set -- "$PARSED_OPTIONS"
while true; do
case $1 in
p) proxy=$2; shift 2 ;;
d) dir=$2; shift 2 ;;
a) ua=$2; shift 2 ;;
r) ref=$2; shift 2;;
--) shift; break ;;
esac
done
答案 2 :(得分:1)
就我而言,这似乎是最好的选择:
调用脚本如:
bash curl.sh -d Remote -a "Moz 123" -r http://localhost http://www.google.com/
您可以选择最后一个参数:
url=${!#}
然后使用getopts的其他选项,如上所述。