我想对一组变量运行 for 循环,我错误地将其表示为{A,B}
。接下来我的脚本如下所示:
#!/bin/sh
for {A,B} in {1,2} {3,4} {5,6} {7,8}
do
echo A=$A B=$B
C=$(($A+$B))
echo Sum,C = $C
done
我怎样才能纠正它?
答案1
我会用
while read A B
do echo A=$A B=$B
C=$(( $A + $B ))
echo Sum,C = $C
done<<EOF
1 2
3 4
5 6
7 8
EOF
对于更复杂的操作 dc 是你的朋友(改进反向表示法!)
C=$(echo "$A $B +pq"|dc)
答案2
set 1 2 3 4 5 6 7 8
while [ "$#" -gt 0 ]
do C="$(($1+$2))"
shift 2
done
for
不允许以这种方式同时分配两个任务。因此,获取一个数组并shift
按照您想要的时间间隔将其移走。如果您像我上面那样使用标准 shell$@
数组,那么您将始终使用前两个位置$1
和$2
。如果您使用某种扩展数组,那么您将使用${array[0]}
and${array[1]}
或${array[1]}
and ,${array[2]}
具体取决于您的 shell。
另外,通过for
循环,您可以将某种分隔符编码到每个参数中:
for x in 1+2 3+4 5+6 7+8
do C="$(($x))"
done
...实际上这里工作得很好,但通常做得不太干净。
答案3
我可以做出一个可能的解决方法(感谢@mikeserv为我提供了数组的想法):
array=('1 2' '3 4' '5 6' '7 8')
for x in "${array[@]}"
do
A=`echo $x | awk '{print $1}'`
B=`echo $x | awk '{print $2}'`
echo A=$A B=$B
C=$(($A+$B))
echo Sum,C = $C
done
建议是否可以进一步简化。