说我有一个数组:
ITEMS=(
"foo"
"bar"
"baz"
)
我要运行以下命令:
cat template \
| my_command $ITEMS[1] \
| my_command $ITEMS[2] \
| my_command $ITEMS[3] \
> output
由于阵列是动态的,我不想为每个阵列项目的my_command
进行硬编码。
我可以执行以下操作:
cat template > output
for var in "${ITEMS[@]}"; do
cat output | my_template $var > output
done
但这似乎很笨拙,因为它多次写入文件。
当调用次数未知时,是否可以将所有my_command
调用都放入同一命令中?
答案 0 :(得分:3)
使用一些好的老式递归。
1)
情况下),请直接运行命令。*)
情况),请使用第一个参数(${args[0]}
)运行它,然后将其输送到删除了第一个参数的multipipe
的递归调用({ {1}}。${args[@]:1}
答案 1 :(得分:0)
这是一种使用<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.js"></script>
<div id="app">
<v-app id="inspire">
<v-form ref="form">
<v-text-field v-model="values[0]" :rules="rules.first"></v-text-field>
<v-text-field v-model="values[1]" :rules="rules.second"></v-text-field>
</v-form>
</v-app>
</div>
和恶毒的printf
的方式:
eval
仅在确定eval $(printf 'cat template '; printf '| my_command "%s" ' "${ITEMS[@]}") > output
数组中没有恶意条目时才使用它。
答案 2 :(得分:0)
您可以将整个循环块重定向到输出,所以:
for var in "${ITEMS[@]}"; do
my_template "${var}" <template
done >output
或者,如果您的my_template
程序可以接受多个项目作为参数,则可以通过以下操作在一次调用中将所有数组传递给它:
my_template "${ITEMS[@]}" <template
这将呼叫:
my_template "foo" "bar" "baz" <template