bash方法,便于使用大量参数调用二进制文件

时间:2013-09-24 18:44:53

标签: bash

试图找出自动运行的最佳方法 一个需要大量参数和更改的命令 他们中有一些。目前的做法是:

#!/bin/bash

# 5 more of these
VALUE=42
STUFF=12
CHARLIE=96

# Note that these are not sequential, just a bad example
PARAM[0]='--oneparameter=17'
PARAM[1]='--anotherparam=FOO'
PARAM[2]='--yetanotherparam=BAR'
PARAM[3]='--someparam4=314'
# the above continues for 15 parameters or so
# and then some ones like this one:
PARAM[16]="--someparam=astring${STUFF}.foo"
PARAM[20]="--someparam20=filename${VALUE}.foo"

然后我调用二进制文件:

./mybinary ${PARAM[@]}

一切都很顺利。

然后我为第二次运行更改了一些参数:

PARAM[1]='--anotherparam=BAR'
VALUE=84
# Here I need to include all lines that depends on VALUE
# for the parameter expansion to work
PARAM[20]="--someparam20=filename${VALUE}.foo"

./mybinary ${PARAM[@]}

这种情况持续了30次左右......

上述工作但它很丑陋且容易出错,但我不能 找出一个更好的方法来做到这一点! 非常感谢任何帮助!

感谢。

5 个答案:

答案 0 :(得分:1)

你可以使用循环:

for (( I = 0; I <= 15; ++I )); do
    PARAM[I]="--someparam$((I + 1))=$((I + 1))"
done
VALUE=84
for (( I = 16; I <= 20; ++I )); do
    PARAM[I]="--someparam${I}=filename${VALUE}.foo"
done

您还可以使用一个功能来自动化它:

function callbinary {
    local PARAM=()
    for (( I = 0; I <= 15; ++I )); do
        PARAM[I]="--someparam$((I + 1))=$((I + 1))"
    done
    VALUE=$2
    for (( I = 16; I <= 20; ++I )); do
        PARAM[I]="--someparam${I}=filename${VALUE}.foo"
    done
    "$1" "${PARAM[@]}"
}

callbinary ./mybinary 84

您可以自定义它以接受可用于自定义参数的更多参数。

一般来说,你可以让事情变得更加静态:

PARAM=(
    [0]='--oneparameter=17'
    [1]='--anotherparam=FOO'
    [2]='--yetanotherparam=BAR'
    [3]='--someparam4=314'

    [16]="--someparam=astring${STUFF}.foo"
    [20]="--someparam20=filename${VALUE}.foo"
)

答案 1 :(得分:1)

如果只是少数参数发生变化,你可以循环使用这些参数。

while read exuberance value attrition attitude spin badness; do
    ./mybinary --someparam1=17 \
            --someparam2="$exuberance" \
            --someparam2=BAR \
            --someparam2="$attrition" \
            # :
            --someparam20="astring${spin}.foo" \
            --someparam20="filename${value}.foo"
done <<____HERE
    42 317 xy Thirty7 vitamins 117
    41 3112 bb Virgo pizza 56
    41 3113 az Virgo pizza 37
    69 512 bee Ozone onion 99
____HERE

答案 2 :(得分:0)

如果您知道要更改的内容,可以在bash脚本中使用参数

/bin/bash your_bashfile change_value1 change_value2

然后在您的bash文件中,您使用$1$2来引用您的参数

VALUE=$1
PARAM[1]="--someparam2=$2" 

答案 3 :(得分:0)

可以编写一个接受VALUE作为参数的函数,并相应地设置PARAM个条目。例如:

setParams() {
    VALUE=$1
    PARAM[0]='--someparam1=1'
    PARAM[1]='--someparam2=2'
    ...etc...
    PARAM[20]="--someparam20=filename${VALUE}.foo"
    PARAM[21]="--someparam21=filename${VALUE}.fee"
}

对于问题中提到的两次运行,你会说

setParams 42
./mybinary ${PARAM[@]}
setParams 84
PARAM[1]='--someparam2=42'
./mybinary ${PARAM[@]}

(任何与setParams设置的默认值不同的参数都需要在setParams调用后设置。)

答案 4 :(得分:0)

我不确定是否指向外部工具是不受欢迎的,但这看起来像我最近偶然发现的脚本可能能够提供一些帮助:optparse。它是getopts的包装器,它使得命令行参数的定义变得更加容易,并且由于它是用bash编写的,它没有任何依赖关系,你可以将它与其余的代码嵌入。