将多个参数传递给Bash脚本

时间:2014-03-01 21:52:49

标签: bash getopts

我有一个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等。

你如何让这个工作?

3 个答案:

答案 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的其他选项,如上所述。