如何在元组中使用/ in?

时间:2017-01-03 18:41:35

标签: bash

是否可以执行以下操作:

for (a,b) in (1,2) (2,1)
do
run_program.py $a $b
done

我只知道Linux中的for do done语法。我想用特定的两个(a,b)实例运行程序(或者当然,它很容易推广到大于两个实例)。

1 个答案:

答案 0 :(得分:4)

bash中没有元组构造,也没有解构(在迭代a=1时,您依赖于指定b=2(1,2)的行为)。你可以做的是拥有多个数组,其中每个数组中的相同索引引用相应的数据,并按索引进行迭代。

#!/bin/bash
#      ^^^^ - IMPORTANT: /bin/sh does not support arrays, you *must* use bash

a1=( 1 2 )                  # a1[0]=1; a1[1]=2
a2=( 2 1 )                  # a2[0]=2; a2[1]=1
for idx in "${!a1[@]}"; do  # iterate over indices: idx=0, then idx=1
  a=${a1[$idx]}             # lookup idx in array a1
  b=${a2[$idx]}             # lookup idx in array a2
  run_program.py "$a" "$b"  # ...and use both
done

语法指针:

  • "${!array[@]}"扩展为数组array的索引列表。
  • a1=( 1 2 )分配给名为a1的数组。有关bash中数组的介绍,请参阅BashFAQ #5

如果你的输入中有限制,允许明确地分割项目,那么也可以(hackishly)使用它。有关使用BashFAQ #1中解释的行为模式的示例:

inputs='1:2,2:1,'
while IFS=: read -r -d, a b <&3; do
  run_program.py "$a" "$b" 3<&-
done 3<<<"$inputs"

请注意,此处3的使用是任意的:文件描述符0,1和2保留给stdin,stdout和stderr; 3-9明确可用于shell脚本使用;并且在实践中,更高的FD数量也趋于可用(但是易于动态地自动分配以存储备份或其他shell行为;也就是说,表现良好的shell不会踩踏FD用户已明确分配的内容,并将移动FD自动分配,以便在用户将其显式使用时将暂时重定向的描述符的备份存储在远程。)