试图找出自动运行的最佳方法 一个需要大量参数和更改的命令 他们中有一些。目前的做法是:
#!/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次左右......
上述工作但它很丑陋且容易出错,但我不能 找出一个更好的方法来做到这一点! 非常感谢任何帮助!
感谢。
答案 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编写的,它没有任何依赖关系,你可以将它与其余的代码嵌入。