循环在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