Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

Linux 셸 스크립팅을 위한 12 Bash For 루프 예제

Linux 셸 스크립팅을 위한 12 Bash For 루프 예제bash for 루프에는 두 가지 유형이 있습니다. 하나는 값 목록과 함께 "in" 키워드를 사용하고 다른 하나는 구문과 같은 C 프로그래밍을 사용합니다.

이 기사는 진행 중인 bash 튜토리얼 시리즈의 일부입니다.

이것은 bash for 루프 메소드를 모두 설명하고 쉘 스크립트에서 bash for 루프를 사용하는 방법에 대한 12가지 다른 예를 제공합니다.

나중에 참조할 수 있도록 이 문서를 책갈피에 추가하십시오. 예를 들어 bash for 루프를 사용하는 방법을 참조해야 합니다.

방법 1:"in" 및 값 목록을 사용하는 Bash For 루프

구문:

for varname in list
do
 command1
 command2
 ..
done

위 구문에서:

  • for, in, do 및 done 키워드
  • "목록"에는 값 목록이 포함됩니다. 목록은 공백으로 구분된 여러 단어를 포함하는 변수일 수 있습니다. for 문에 목록이 없으면 셸에 전달된 위치 매개변수를 사용합니다.
  • varname은 모든 Bash 변수 이름입니다.

이 형식에서 for 문은 목록의 각 항목에 대해 한 번씩 본문에 포함된 명령을 실행합니다. 예를 들어 값 목록에 5개의 항목이 포함된 경우 for 루프는 목록의 각 항목에 대해 한 번씩 총 5번 실행됩니다. 목록의 현재 항목은 루프를 통해 매번 변수 "varname"에 저장됩니다. 이 "varname"은 for 루프의 본문에서 처리할 수 있습니다.

방법 2:C와 같은 구문을 사용하는 Bash For 루프

for 루프의 두 번째 형식은 "C" 프로그래밍 언어의 for 루프와 유사하며 세 가지 표현식(초기화, 조건 및 업데이트)이 있습니다.

<센터>
for (( expr1; expr2; expr3 ))
do
 command1
 command2
 ..
done

명령 구문에 대한 위의 bash에서

  • 첫 번째 반복 전에 expr1이 평가됩니다. 이것은 일반적으로 루프의 변수를 초기화하는 데 사용됩니다.
  • do와 done 사이의 모든 문장은 expr2의 값이 TRUE가 될 때까지 반복적으로 실행됩니다.
  • 루프를 반복할 때마다 expr3이 평가됩니다. 이것은 일반적으로 루프 카운터를 증가시키는 데 사용됩니다.

다음 12가지 예는 for 루프를 다양한 방식으로 bash하는 방법을 보여줍니다.

1. "in" 키워드 뒤의 목록에 대한 정적 값

다음 예에서 값 목록(Mon, Tue, Wed, Thu, Fri)은 bash for 루프에서 "in" 키워드 바로 뒤에 제공됩니다.

$ cat for1.sh
i=1
for day in Mon Tue Wed Thu Fri
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

주의: 값 목록은 쉼표로 구분하지 않아야 합니다(Mon, Tue, Wed, Thu, Fri). 쉼표는 값의 일부로 처리됩니다. 즉, 아래 예와 같이 "Mon" 대신 "Mon"을 값으로 사용합니다.

$ cat for1-wrong1.sh
i=1
for day in Mon, Tue, Wed, Thu, Fri
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1-wrong1.sh
Weekday 1 : Mon,
Weekday 2 : Tue,
Weekday 3 : Wed,
Weekday 4 : Thu,
Weekday 5 : Fri

주의: 값 목록은 큰따옴표로 묶으면 안 됩니다. ("월 화 수 목 금"). 큰따옴표로 묶으면 아래 예와 같이 단일 값(5개의 다른 값 대신)으로 처리됩니다.

$ cat for1-wrong2.sh
i=1
for day in "Mon Tue Wed Thu Fri"
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1-wrong2.sh
Weekday 1 : Mon Tue Wed Thu Fri

2. "in" 키워드 뒤의 목록에 대한 변수

for 루프에서 직접 값을 제공하는 대신 다음 예와 같이 변수에 값을 저장하고 "in" 키워드 뒤에 for 루프에서 변수를 사용할 수 있습니다.

$ cat for2.sh
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in $weekdays
do
 echo "Weekday $((i++)) : $day"
done

$ ./for2.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

주의 :가장 좋은 방법은 bash 변수를 참조할 때 항상 인용하는 것입니다. 이 모범 사례 규칙에는 몇 가지 예외가 있습니다. 이것은 그들 중 하나입니다. 이 for 루프에서 변수를 큰따옴표로 묶으면 값 목록이 단일 값으로 처리됩니다. 많은 사람들이 이 함정에 빠진다. 주의하고 for 루프에서 변수를 큰따옴표로 묶지 마십시오.

$ cat for2-wrong.sh
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in "$weekdays"
do
 echo "Weekday $((i++)) : $day"
done

$ ./for2-wrong.sh
Weekday 1 : Mon Tue Wed Thu Fri

3. 목록을 지정하지 마십시오. 위치 매개변수에서 가져오기

bash for 루프에서 키워드 "in" 뒤에 값 목록을 지정하지 않으면 위치 매개변수(예:셸 스크립트에 전달되는 인수)를 사용합니다.

$ cat for3.sh
i=1
for day
do
 echo "Weekday $((i++)) : $day"
done

$ ./for3.sh Mon Tue Wed Thu Fri
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

주의: 이 방법을 사용할 경우 주의하시기 바랍니다. for 루프에 "in" 키워드를 포함하면 안 됩니다. 키워드 "in"을 값 없이 그대로 두면 아래와 같이 위치 매개변수를 사용하지 않습니다. 루프 내부로 들어가지 않습니다. 즉, 아래 예와 같이 for 루프는 절대 실행되지 않습니다.

$ cat for3-wrong.sh
i=1
for day in
do
 echo "Weekday $((i++)) : $day"
done

$ ./for3-wrong.sh Mon Tue Wed Thu Fri

참고 :bash 위치 매개변수에 대한 자세한 내용은 이전 기사를 참조하십시오.

4. "in" 키워드 뒤의 목록 값으로 Unix 명령 출력

아래와 같이 역따옴표 ` `로 명령을 묶어서 모든 UNIX/Linux 명령의 출력을 for 루프에 대한 값 목록으로 사용할 수 있습니다.

$ cat for4.sh
i=1
for username in `awk -F: '{print $1}' /etc/passwd`
do
 echo "Username $((i++)) : $username"
done

$ ./for4.sh
Username 1 : ramesh
Username 2 : john
Username 3 : preeti
Username 4 : jason
..

5. for 루프에서 파일 및 디렉토리 루프

특정 디렉토리 아래에 있는 파일과 디렉토리를 반복하려면 해당 디렉토리로 이동하고 아래와 같이 for 루프에 *를 입력합니다.

다음 예는 홈 디렉토리 아래의 모든 파일과 디렉토리를 반복합니다.

$ cat for5.sh
i=1
cd ~
for item in *
do
 echo "Item $((i++)) : $item"
done

$ ./for5.sh
Item 1 : positional-parameters.sh
Item 2 : backup.sh
Item 3 : emp-report.awk
Item 4 : item-list.sed
Item 5 : employee.db
Item 8 : storage
Item 9 : downloads

bash for 루프에서 *를 사용하는 것은 ls 명령(및 기타 명령)을 사용할 때 Linux 명령줄에서 사용하는 파일 글로빙과 유사합니다.

예를 들어, 다음은 홈 디렉토리 아래의 모든 파일과 디렉토리를 표시합니다. 위의 for5.sh 예제에서 사용한 개념입니다.

cd ~
ls *

다음은 /etc 디렉토리 아래에 a, b 또는 c 또는 d로 시작하는 모든 *.conf 파일을 표시합니다.

$ ls -1 /etc/[abcd]*.conf
/etc/asound.conf
/etc/autofs_ldap_auth.conf
/etc/cas.conf
/etc/cgconfig.conf
/etc/cgrules.conf
/etc/dracut.conf

위의 ls 명령에 사용된 것과 동일한 인수를 아래 예와 같이 bash for 루프에서 사용할 수 있습니다.

$ cat for5-1.sh
i=1
for file in /etc/[abcd]*.conf
do
 echo "File $((i++)) : $file"
done

$ ./for5-1.sh
File 1 : /etc/asound.conf
File 2 : /etc/autofs_ldap_auth.conf
File 3 : /etc/cas.conf
File 4 : /etc/cgconfig.conf
File 5 : /etc/cgrules.conf
File 6 : /etc/dracut.conf

6. for 루프에서 벗어나기

아래와 같이 'break' 명령을 사용하여 for 루프에서 벗어날 수 있습니다.

$ cat for6.sh
i=1
for day in Mon Tue Wed Thu Fri
do
 echo "Weekday $((i++)) : $day"
 if [ $i -eq 3 ]; then
 break;
 fi
done

$ ./for6.sh
Weekday 1 : Mon
Weekday 2 : Tue

7. for 루프의 맨 위에서 계속

특정 조건에서는 아래 표시된 계속 명령을 사용하여 for 루프의 나머지 명령을 무시하고 위에서부터 루프를 다시 계속할 수 있습니다(목록의 다음 값에 대해).

다음 예는 토요일과 일요일에 "(WEEKEND)"를 추가하고 나머지 요일에 "(평일)"을 추가합니다.

$ cat for7.sh
i=1
for day in Mon Tue Wed Thu Fri Sat Sun
do
 echo -n "Day $((i++)) : $day"
 if [ $i -eq 7 -o $i -eq 8 ]; then
 echo " (WEEKEND)"
 continue;
 fi
 echo " (weekday)"
done

$ ./for7.sh
Day 1 : Mon (weekday)
Day 2 : Tue (weekday)
Day 3 : Wed (weekday)
Day 4 : Thu (weekday)
Day 5 : Fri (weekday)
Day 6 : Sat (WEEKEND)
Day 7 : Sun (WEEKEND)

8. C 프로그램 구문을 사용한 Bash for 루프

이 예제에서는 C for 루프 구문과 유사한 bash for 루프의 두 번째 방법을 사용합니다. 다음 예제는 bash C 스타일 for 루프를 사용하여 5개의 난수를 생성합니다.

$ cat for8.sh
for (( i=1; i <= 5; i++ ))
do
 echo "Random number $i: $RANDOM"
done

$ ./for8.sh
Random number 1: 23320
Random number 2: 5070
Random number 3: 15202
Random number 4: 23861
Random number 5: 23435

9. 루프용 무한 Bash

bash C 스타일의 for 루프에서 시작, 조건 및 증분을 제공하지 않으면 무한 루프가 됩니다. 루프를 중지하려면 Ctrl-C를 눌러야 합니다.

$ cat for9.sh
i=1;
for (( ; ; ))
do
 sleep $i
 echo "Number: $((i++))"
done

위에서 말했듯이 이 bash 무한 for 루프에서 벗어나려면 Ctrl-C를 누르십시오.

$ ./for9.sh
Number: 1
Number: 2
Number: 3

10. bash C 스타일 for 루프에서 쉼표 사용

bash c 스타일 루프에서 조건에 사용된 값을 증가시키는 것 외에도 아래와 같이 다른 값을 증가시킬 수도 있습니다.

bash C 스타일 for 루프의 initialize 섹션과 increment 섹션에서 아래와 같이 쉼표로 구분하여 여러 값을 가질 수 있습니다.

다음 for 루프는 변수 i를 사용하여 총 5번 실행됩니다. 그러나 변수 j는 5로 시작하고 루프가 실행될 때마다 5씩 증가합니다.

$ cat for10.sh
for ((i=1, j=10; i <= 5 ; i++, j=j+5))
do
 echo "Number $i: $j"
done

$ ./for10.sh
Number 1: 10
Number 2: 15
Number 3: 20
Number 4: 25
Number 5: 30

11. "in" 키워드 뒤의 숫자 범위

중괄호 확장을 사용하여 for 루프 "in"에서 숫자 범위를 사용하여 루프를 돌 수 있습니다.

다음 예제는 1부터 10까지의 값을 사용하여 10번 반복합니다.

$ cat for11.sh
for num in {1..10}
do
 echo "Number: $num"
done

$ ./for11.sh
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5
...

12. "in" 키워드 뒤에 증분되는 숫자 범위

다음 예제는 1부터 10까지의 값을 사용하여 5번 반복하며 2씩 증가합니다. 즉, 1에서 시작하여 10에 도달할 때까지 2씩 계속 증가합니다.

$ cat for12.sh
for num in {1..10..2}
do
 echo "Number: $num"
done

$ ./for12.sh
Number: 1
Number: 3
Number: 5
Number: 7
Number: 9

추신: 나중에 참조할 수 있도록 이 기사를 즐겨찾기에 추가하는 것을 잊지 마십시오.