2014-03-01 173 views
0

我有一个bash脚本,我想这样的呼吁:多个参数传递给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等

你如何得到这个工作?

回答

1

在我而言,这似乎是最好的选择:

调用脚本,如:

bash curl.sh -d Remote -a "Moz 123" -r http://localhost http://www.google.com/ 

你可以选择最后一个参数就像:

url=${!#} 

然后其他选项使用getopts,如上。

1

getopts只要看到一个不以连字符开头的参数,就会停止解析。您必须更改传递参数的顺序,或者使用GNU版本的外部程序getopt,该程序可以处理与选项混合的常规参数。

我认为以下应该工作(它的模拟您的代码和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:" -- "[email protected]") 
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 
+0

你能够引用一些代码,我可以看到这与常规参数和选项一起使用吗? –

3

为什么不传入参数,用引号括起来?

例如

script.shl "http://www.google.com" "/var/www/test" "option 3" 

...那么你可以直接在脚本中使用$ 1 $ 2 $ 3来访问它们。你仍然可以通过使用if ... else来改变脚本的过程。

除非,我已经错读你的问题......

+0

有多个选项可以传递给脚本,有时我不会全部使用它们。所以我要求通过他们,如:-a -b –

+1

啊,虽然你总是可以传递一个空参数? script.shl“www,google.com”“NULL”“选项3”。然后,只要添加一个子句来忽略如果“NULL”被发现... – user3360167

+2

这不能很好地适合可能有许多可选参数的程序。你不需要像'script.shl“”“foo”“”“”“bar”“”“”“”“3”“”“4”'这样的程序。 – chepner