为bash数组中的每个项目运行管道

时间:2019-07-16 11:20:36

标签: arrays bash loops pipe

说我有一个数组:

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调用都放入同一命令中?

3 个答案:

答案 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