Bash의 중첩 for 루프

Abdul Mateen 2023년10월8일
  1. Bash에서 for 루프의 변형
  2. Bash의 중첩 for 루프
Bash의 중첩 for 루프

이 튜토리얼에서는 bash의 중첩 루프에 대해 설명합니다. 먼저 bash에서 사용할 수 있는 다양한 for 루프 공식에 대해 빠르게 논의할 것입니다. 다음으로 중첩된 for 루프에 대해 예제와 함께 설명합니다.

Bash에서 for 루프의 변형

먼저 bash에서 for 루프의 구문을 살펴보겠습니다.

for var in something
do
    command
done

이 구문에서 변수 이름은 사용자가 선택한 것입니다. 무언가에 대한 여러 옵션이 있으며 곧 설명하겠습니다.

우리는 for 본문 안에 얼마든지 명령을 작성할 수 있습니다. 여러 for 루프 변형을 bash에서 사용할 수 있습니다. 아래에서 몇 가지를 빠르게 볼 수 있습니다.

숫자 범위의 ‘for’

for 루프를 사용하여 숫자 목록을 지정할 수 있으며 다음 예제와 같이 해당 숫자를 하나씩 반복할 수 있습니다.

for i in 1 3 8
do
    echo $i
done

루프는 주어진 값 목록(즉, 1 3 8)에서 반복됩니다. 이 특정 예에서 출력은 다음과 같습니다.

1
3
8

값 목록의 ‘for’

값 목록을 정의하고 다음과 같이 목록을 반복할 수 있습니다.

x=(1 3 8)
for i in ${x[@]}
do
    echo $i
done

이 코드의 결과는 이전 예제의 출력과 동일합니다. for 루프 문에서 {x[@]}는 리스트 x의 모든 요소에 대해 나타냅니다.

시퀀스 범위의 ‘for’

시작 번호, 이중 점(..), 종료 번호로 값 범위를 지정할 수 있습니다. 마찬가지로 한 쌍의 다른 점과 단계를 둘 수 있습니다.

예를 들어 다음 두 가지 예제 루프 공식을 살펴보겠습니다.

for i in {1..3}
do
    echo $i
done
echo "----------------------"
for i in {1..3..2}
do
    echo $i
done

이 코드의 출력은 다음과 같습니다.

1
2
3
----------------------
1
3

단어가 있는 문자열의 for

공백으로 구분된 문자열의 단어 목록을 정의하고 다음과 같이 문자열의 단어를 반복할 수 있습니다.

names="Asim Babar Munir Ali"
for name in $names
do
    echo $name
done

이 코드의 출력에는 다음과 같이 별도의 줄에 이름이 지정됩니다.

Asim
Babar
Munir
Ali

C 스타일 for 표현식

C 언어의 for와 유사한 for 루프에서 표현식을 제공할 수 있습니다. 예를 참조하십시오.

for ((i=1;i<=5;i++))
do
    echo $i
done

다음과 같은 출력이 생성됩니다.

1
2
3
4
5

for 루프에서 continue 문 사용

for 루프의 본문에 몇 가지 조건을 입력하고 continue 문을 사용하여 루프의 다음 본문을 건너뛸 수 있습니다. 예를 참조하십시오.

for ((i=1;i<=5;i++))
do
    if [ $i == 3 ]
    then
        continue
    fi
    echo $i
done

if 조건으로 인해 루프는 3 값에 대한 echo 명령을 건너뜁니다. 따라서 출력은 1 2 4 5입니다.

루프 오버 명령줄 인수

bash 스크립트에 명령줄 인수를 제공하고 공백으로 구분된 인수에 대해 for 루프를 실행할 수 있습니다. 예를 참조하십시오.

for i in $@
do
    echo "Script arg is $i"
done

첫 번째 줄에서 $@ 기호는 공백으로 구분된 인수 목록을 나타냅니다. 이 예제의 출력을 참조하십시오.

bash myscript.sh 13 28
Script arg is 13
Script arg is 28

명령의 루프 오버 출력

일부 명령의 출력에 대해 for 루프를 실행할 수 있습니다. 예를 참조하십시오.

for f in $(ls)
do
  echo "**** $f *****"
done

이 스크립트는 ls 명령의 출력을 가져오고 값을 반복합니다. 예제 출력을 참조하십시오.

**** first.c *****
**** second.c *****
**** third.c *****

루프 오버 변수 시퀀스

런타임에 일부 변수를 기반으로 일부 입력을 실행할 수도 있습니다. 이를 위해 seq 1 1 $n을 사용할 수 있습니다. 여기서 n은 변수가 될 수 있습니다. 예를 참조하십시오.

n=4
for i in $(seq 1 1 $n)
do
    echo -n $i
    echo " "
done

여기에서는 값 4를 변수에 할당했지만 단어 수 등과 같은 일부 수일 수 있습니다. 예제 출력을 참조하십시오.

1
2
3
4

Bash의 중첩 for 루프

bash에는 다양한 중첩 for 루프가 있습니다. 요구 사항에 따라 중첩된 for 루프의 여러 변형을 만들 수 있습니다(즉, 사용 가능한 for 루프 형식을 결합하여).

여기에서 출력과 함께 여러 예를 볼 수 있습니다.

  • 처음 5개의 양수 정수의 처음 10개 배수를 출력합니다.
    for number in {1..5}
    do
    	for n in {1..10}
    	do
    		echo -n $((number*$n))
    		echo -n " "
    	done
    	echo ""
    done
    

    이 코드의 출력은 다음과 같습니다.

    1 2 3 4 5 6 7 8 9 10
    2 4 6 8 10 12 14 16 18 20
    3 6 9 12 15 18 21 24 27 30
    4 8 12 16 20 24 28 32 36 40
    5 10 15 20 25 30 35 40 45 50
    
  • 정수 목록의 처음 10개 배수를 인쇄합니다.
    for number in 2 5 9
    do
    	for n in {1..10}
    	do
    		echo -n $((number*$n))
    		echo -n " "
    	done
    	echo ""
    done
    

    이 코드의 출력은 다음과 같습니다.

    2 4 6 8 10 12 14 16 18 20
    5 10 15 20 25 30 35 40 45 50
    9 18 27 36 45 54 63 72 81 90
    
  • 삼각형 패턴으로 숫자를 인쇄하십시오.
    for number in {1..5}
    do
    	for n in $(seq 1 1 $number)
    	do
    		echo -n $n
    	done
    	echo ""
    done
    

    이 코드의 출력은 다음과 같습니다.

    1
    12
    123
    1234
    12345
    

    가변 크기 패턴을 인쇄하기 위해 명령줄 인수에서 여러 줄을 얻을 수 있습니다. 코드 참조:

    for number in $(seq 1 1 $@)
    do
    	for n in $(seq 1 1 $number)
    	do
    		echo -n $n
    	done
    	echo ""
    done
    

    bash pattern2.sh 6 명령의 출력은 다음과 같습니다.

    1
    12
    123
    1234
    12345
    123456
    

    여기서 patter2.sh는 이 스크립트의 이름이고 6은 명령줄 인수입니다.

  • 별표(*) 또는 기타 문자로 삼각형 패턴을 인쇄합니다.
    for number in $(seq 1 1 $@)
    do
    	for n in $(seq 1 1 $number)
    	do
    		echo -n "*"
    	done
    	echo ""
    done
    

    4 인수가 있는 코드의 출력은 다음과 같습니다.

    *
    **
    ***
    ****
    
  • 메시지를 여러 번 인쇄합니다(강조를 위해).
    messages="Sea_is_rough Don't_go_too_far_in_the_sea Remain_in_the_group Don't_take_kids_inside"
    for i in 1 2 3 4 5
    do
    	for message in $messages
    	do
    		echo $message
    	done
    	echo "----------------------------------"
    done
    

    결과는 다음과 같습니다.

    Sea_is_rough
    Don't_go_too_far_in_the_sea
    Remain_in_the_group
    Don't_take_kids_inside
    ----------------------------------
    Sea_is_rough
    Don't_go_too_far_in_the_sea
    Remain_in_the_group
    Don't_take_kids_inside
    ----------------------------------
    Sea_is_rough
    Don't_go_too_far_in_the_sea
    Remain_in_the_group
    Don't_take_kids_inside
    ----------------------------------
    Sea_is_rough
    Don't_go_too_far_in_the_sea
    Remain_in_the_group
    Don't_take_kids_inside
    ----------------------------------
    Sea_is_rough
    Don't_go_too_far_in_the_sea
    Remain_in_the_group
    Don't_take_kids_inside
    ----------------------------------
    
  • 한 줄에 1부터 앞으로 세는 것을 인쇄하십시오. 명령줄 인수 목록까지 계산을 인쇄해야 합니다.
    for number in $@
    do
    	for i in $(seq 1 1 $number)
    	do
    		echo -n "$i "
    	done
    	echo ""
    done
    

    Bash counting.sh 4 5 8에 대한 이 코드의 출력은 다음과 같습니다.

    1 2 3 4
    1 2 3 4 5
    1 2 3 4 5 6 7 8
    
  • 10에서 20까지의 배수를 인쇄하되, 소수의 배수는 이 순서대로 인쇄하지 마십시오.
    for number in $(seq 10 1 20)
    do
    	if [[ $number == 11 || $number == 13 || $number == 17 || $number == 19 ]]
    	then
    		continue
    	fi
    	for n in {1..10}
    	do
    		echo -n $((number*$n))
    		echo -n " "
    	done
    	echo ""
    done
    

    이 코드의 출력은 다음과 같습니다.

    10 20 30 40 50 60 70 80 90 100
    12 24 36 48 60 72 84 96 108 120
    14 28 42 56 70 84 98 112 126 140
    15 30 45 60 75 90 105 120 135 150
    16 32 48 64 80 96 112 128 144 160
    18 36 54 72 90 108 126 144 162 180
    20 40 60 80 100 120 140 160 180 200
    

결론적으로 bash에는 다양한 중첩 for 루프가 있습니다. 따라서 작업을 완료하기 위해 요구 사항에 따라 사용 가능한 for 루프 변형 조합을 사용할 수 있습니다.