쉘 스크립트에 이 루프가 있지만 그 기능을 완전히 이해하지 못하는 것 같습니다.
특히 gawk -v
for ((k=$1; $k<3 + 3 ; k=$k + $3))
do
echo $k | gawk -v s=4 '{print $1*s}'
done
매개변수가 2 10 4라고 가정합니다.
답변1
나는 이것이 숙제 문제라고 상상할 수 있습니다.
그것을 분석해 봅시다. 먼저, 시작하고 $1
, 증가 $3
하고, 중지하는 루프가 있습니다 6
. 따라서 전달하면 2 10 4
루프는 처음부터 시작하여 2
증가합니다 4
. 때문에 즉시 중지됩니다 2 + 4 = 6
.
따라서 다음은 2
인수를 따르십시오 2 10 4
.
for ((k=$1; $k<3 + 3 ; k=$k + $3))
do
echo $k
done
루프를 통과할 때마다 출력을 처리합니다 gawk -v s=4 '{print $1*s}'
. 이것은 매우 작은 "awk" 프로그램입니다. 변수를 설정합니다 s=4
. 그런 다음 인쇄합니다 ( 예 $1*s
: .2 * 4
8
답변2
이 awk
비트는 현재 값 $k
(입력에서 읽는 코드에 있는 값 $1
)에 4(명령줄에 설정된 변수 값)를 곱한 값을 인쇄합니다.awk
awk
s
이게 더 짧을 거예요
printf '%d\n' "$(( 4*k ))"
첫 번째 매개변수부터 세 번째 매개변수까지 5단계를 반복합니다. 두 번째 주장은 아무런 차이가 없습니다.
그래서 모든 것을 다음과 같이 단순화할 수 있습니다.
seq "$(( 4*$1 ))" "$(( 4*$3 ))" 20
GNU의 세 가지 매개변수 seq
는 "시작,증가, 그리고끝". 이것은산출, 출력은 항상 루프 변수의 현재 값의 4배입니다. 루프는 에서 시작하므로 $1
출력은 해당 값의 4배에서 시작됩니다. 주기가 증가 $3
하므로 4배가 됩니다. 루프는 $k
최대 5(1 less 3+3
)로 끝나므로 출력은 end 입니다 4*5
.
또는 루프 seq
로 호출 하려는 경우 :bash
for (( k = 4*$1; k <= 20; k += 4*$3 )); do
printf '%d\n' "$k"
done
그리고 보시다시피,
for (( k = $1; k <= 5; k += $3 )); do
printf '%d\n' "$(( 4*k ))"
done
그리 멀지 않습니다.