3

Trying to figure out the best way to automate running a command that takes a lot of parameters and changing some of them. Current approach is this:

#!/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"

Then I call the binary:

./mybinary ${PARAM[@]}

and all is well.

Then I change some parameter for the second run:

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[@]}

This continues for 30 runs or so...

The above works but it's ugly and error-prone but I can't figure out a better way to do it! Any help is greatly appreciated!

Thanks.

4

5 回答 5

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
于 2013-09-24T19:38:46.093 回答
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"
)
于 2013-09-24T19:03:40.873 回答
0

我不确定是否不赞成指向外部工具,但这看起来像是我最近偶然发现的一个脚本可能会有所帮助的东西:optparse。它是 getopts 的包装器,使定义命令行参数变得更加容易,并且由于它是用 bash 编写的,它没有任何依赖项,您可以将其嵌入到其余代码中。

于 2013-09-25T04:35:58.907 回答
0

如果你知道你会改变什么,你可以在你的 bash 脚本中使用参数,

/bin/bash your_bashfile change_value1 change_value2

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

VALUE=$1
PARAM[1]="--someparam2=$2" 
于 2013-09-24T18:52:38.383 回答
0

可以编写一个接受 aVALUE作为参数并相应地设置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调用后设置。)

于 2013-09-24T18:58:37.797 回答