로 잘못 표현된 변수 집합에 대해 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
원하는 간격으로 이동하십시오. 위에서 했던 것처럼 표준 쉘 배열을 사용하는 경우 $@
항상 처음 두 개의 위치 $1
합계를 사용하게 됩니다 $2
. 일종의 확장 배열을 사용하는 경우 쉘에 따라 ${array[0]}
and ${array[1]}
또는 ${array[1]}
and 중 하나를 사용하게 됩니다.${array[2]}
또한 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
이것이 더 단순화될 수 있는지 제안하십시오.