3

多くのパラメーターを取り、それらのいくつかを変更するコマンドの実行を自動化する最良の方法を見つけようとしています。現在のアプローチは次のとおりです。

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

そしてすべてが順調です。

次に、2 回目の実行でいくつかのパラメーターを変更します。

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回ほど続きます...

上記は機能しますが、醜くエラーが発生しやすいですが、それを行うより良い方法がわかりません! どんな助けでも大歓迎です!

ありがとう。

4

5 に答える 5

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 に答える
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 に答える
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 に答える