쉘 스크립트Bash

쉘 스크립트Bash

쉘 스크립트에 이 루프가 있지만 그 기능을 완전히 이해하지 못하는 것 같습니다.

특히 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 * 48

답변2

awk비트는 현재 값 $k(입력에서 읽는 코드에 있는 값 $1)에 4(명령줄에 설정된 변수 값)를 곱한 값을 인쇄합니다.awkawks

이게 더 짧을 거예요

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

그리 멀지 않습니다.

관련 정보