循环在bash中的元组?

是否有可能循环在bash的元组?

作为一个例子,如果下面的工作会很好:

for (i,j) in ((c,3), (e,5)); do echo "$i and $j"; done 

有没有一种解决方法,让我循环元组?

 $ for i in c,3 e,5; do IFS=","; set -- $i; echo $1 and $2; done c and 3 e and 5 

关于这个set使用(从man builtins ):

在选项处理之后剩余的任何参数都将被视为位置参数的值,并按顺序分配给$ 1,$ 2,… $ n

IFS=","设置字段分隔符,所以每个$i被正确地分割成$1$2

通过这个博客 。

编辑:更正确的版本,由@SLACEDIAMONDbuild议:

 $ OLDIFS=$IFS; IFS=','; for i in c,3 e,5; do set -- $i; echo $1 and $2; done; IFS=$OLDIFS c and 3 e and 5 

我相信这个解决scheme比其他已经提交的解决scheme要简单一些,不过这个 bash风格的指南用来说明如何使用read来在分隔符处拆分string,并将它们分配给各个variables。

 for i in c,3 e,5; do IFS=',' read item1 item2 <<< "${i}" echo "${item1}" and "${item2}" done 
 c=('a' 'c') n=(3 4 ) for i in $(seq 0 $((${#c[*]}-1))) do echo ${c[i]} ${n[i]} done 

有时可能会更方便。

解释ugly部分,正如在评论中指出的那样:

seq 0 2产生数字序列0 1 2. $(cmd)是命令replace,所以在本例中seq 0 2的输出是数字序列。 但是什么是上限, $((${#c[*]}-1))

$((somthing))是算术扩展,所以$((3 + 4))是7等等。我们的expression式是${#c[*]}-1 ,所以东西 – 1。很简单,如果我们知道什么${#c[*]}是。

c是一个数组,c [ ]只是整个数组,$ {#c [ ]}是数组的大小,在我们的例子中是2。 现在我们把所有的东西都回滚了: for i in $(seq 0 $((${#c[*]}-1))) for i in $(seq 0 $((2-1))) for i in $(seq 0 1)for i in 0 1 。 因为数组中的最后一个元素的索引是Array – 1的长度。

 $ echo 'c,3;e,5;' | while IFS=',' read -d';' ij; do echo "$i and $j"; done c and 3 e and 5 

使用GNU并行:

 parallel echo {1} and {2} ::: ce :::+ 3 5 

要么:

 parallel -N2 echo {1} and {2} ::: c 3 e 5 

要么:

 parallel --colsep , echo {1} and {2} ::: c,3 e,5 

多一点参与,但可能是有用的:

 a='((c,3), (e,5))' IFS='()'; for t in $a; do [ -n "$t" ] && { IFS=','; set -- $t; [ -n "$1" ] && echo i=$1 j=$2; }; done