Linux의 Bash For Loops에 대해 알아야 할 모든 것

Linux의 Bash For Loops에 대해 알아야 할 모든 것

Bash 스크립트는 특히 다른 기존 프로그램을 활용하는 작업을 자동화하는 매우 효율적인 수단입니다. 이 자동화는 종종 유사한 작업을 여러 번 반복해야 합니다. for 루프 저절로 들어옵니다.





Linux 및 Mac 시스템 관리자는 일반적으로 터미널을 통한 스크립팅에 익숙하지만 Windows 사용자도 Linux용 Windows 하위 시스템으로 작업 시작 .





Bash 스크립트 작동 방식

bash 스크립트는 bash 셸이 읽고 실행할 수 있는 일련의 명령을 포함하는 단순한 일반 텍스트 파일입니다. Bash는 Catalina 이전 macOS 및 대부분의 Linux 배포판의 기본 셸입니다.





이전에 쉘 스크립트로 작업한 적이 없다면 가장 간단한 경우부터 시작해야 합니다. 이를 통해 스크립트 생성 및 실행을 포함한 주요 개념을 연습할 수 있습니다.

먼저 편리한 위치에 다음 파일을 만듭니다(이상적으로는 터미널을 열고 먼저 원하는 디렉토리로 이동).



#!/bin/bash
echo 'Hello, World'

첫 번째 줄은 이 프로그램을 실행하는 방법을 알려줍니다(예: bash 인터프리터 사용). 두 번째는 명령줄에 입력할 수 있는 다른 명령과 같습니다. 해당 파일을 다른 이름으로 저장 hello_world.sh , 그 다음에:

$ chmod +x hello_world.sh
$ ./hello_world.sh

NS chmod 첫 번째 줄의 명령은 파일을 실행 가능하게 만듭니다. 즉, 두 번째 줄과 같이 파일 이름을 입력하여 실행할 수 있습니다.





Hello, World라는 단어가 터미널의 한 줄에 인쇄된 것을 보면 모든 것이 필요에 따라 작동하는 것입니다.

For 루프의 작동 방식

일반적인 프로그래밍에는 두 가지 주요 유형의 for 루프가 있습니다. 숫자 그리고 각각 . 숫자 유형은 전통적으로 가장 일반적이지만 bash 사용에서는 일반적으로 반대입니다.





숫자 for 루프는 일반적으로 수행할 반복 횟수를 결정하는 단일 정수에 중점을 둡니다. 예를 들면 다음과 같습니다.

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

이것은 루프 내에서 i가 변경되거나 다른 명령문이 for 루프 실행을 중단시키지 않는 한 정확히 100번 반복되는 친숙한 for 루프입니다.

이와 대조적으로 Foreach 루프는 목록이나 배열과 같은 구조에서 작동하고 해당 컬렉션 내의 모든 항목에 대해 반복하는 경향이 있습니다.

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

일부 언어는 컬렉션과 항목의 순서를 바꾸는 약간 다른 구문을 사용합니다.

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

For in 루프

bash에서 foreach 또는 에 대한 - 루프가 더 일반적입니다. 기본 구문은 간단히 다음과 같습니다.

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

예를 들어, 명시적으로 명명된 세 개의 파일을 반복하려면 다음을 수행합니다.

YouTube에서 동영상 추천을 중지하는 방법
for file in one.c two.c three.c
do
ls '$file'
done

이러한 파일이 현재 디렉토리에 있는 경우 이 스크립트의 출력은 다음과 같습니다.

one.c
two.c
three.c

고정된 파일 세트 대신 glob 패턴(와일드카드 포함 - 다른 문자를 나타내는 특수 문자 포함)을 통해 목록을 얻을 수 있습니다. 다음 예에서 for 루프는 이름이 '.xml'로 끝나는 모든 파일(현재 디렉토리에 있음)을 반복합니다.

for file in *.xml
do
ls -l '$file'
done

다음은 몇 가지 출력 예입니다.

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

이것은 매우 긴 방법으로 보일 수 있습니다.

$ ls -l *.xml

그러나 중요한 차이점이 있습니다. for 루프가 실행됩니다. 매번 하나의 파일 이름이 전달되는 별도의 2번 프로그램. 별도의 ls 예제에서 glob 패턴(*.xml)은 먼저 파일 이름과 일치한 다음 모든 파일을 개별 명령줄 매개변수로 .

다음은 화장실 (단어 수) 프로그램을 사용하여 차이를 더 명확하게 만듭니다.

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

NS 화장실 프로그램은 각 파일의 줄 수를 개별적으로 계산한 다음 모든 줄의 총 수를 인쇄합니다. 대조적으로 만약 화장실 for 루프 내에서 작동합니다.

for file in *.xml
do
wc -l $file
done

각 파일의 개수는 계속 표시됩니다.

44 feed.xml
231 sitemap.xml

그러나 전체 요약 합계는 없습니다. 화장실 루프가 반복될 때마다 독립적으로 실행됩니다.

목록이 목록이 아닐 때

bash가 인용된 인수/문자열을 처리하는 방식 때문에 for 루프를 다룰 때 매우 쉽고 일반적인 실수가 있습니다. 파일 목록을 순회하려면 다음과 같이 해야 합니다.

for file in one.c two.c

이건 아니야:

for file in 'one.c two.c'

두 번째 예는 파일 이름을 큰따옴표로 묶어 단일 매개변수만 있는 목록을 생성합니다. for 루프는 한 번만 실행됩니다. 이 문제는 다음과 같은 경우에 변수를 사용하여 피할 수 있습니다.

FILES='one.c two.c'
for file in $FILES
do
...
done

변수 선언 자체는 값을 큰따옴표로 묶어야 합니다!

내 Xbox One이 저절로 켜지는 이유

목록이 없는 경우

반복할 것이 없으므로 for 루프는 호출될 때 스크립트에 제공된 명령줄 인수에 대해 작동합니다. 예를 들어 다음과 같은 스크립트가 있는 경우 args.sh 다음을 포함:

#!/bin/sh
for a
do
echo $a
done

그런 다음 args.sh를 실행하면 다음이 표시됩니다.

$ ./args.sh one two three
one
two
three

Bash는 이 경우를 인식하고 처리합니다. 하기 위해 의 동등물로서 $@에 대한 여기서 $@는 명령줄 인수를 나타내는 특수 변수입니다.

전통적인 숫자 For 루프 에뮬레이션

Bash 스크립트는 종종 파일 목록이나 다른 명령의 출력 행을 처리하므로 for in 유형의 루프가 일반적입니다. 그러나 기존의 c 스타일 작업은 계속 지원됩니다.

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

이것은 다음과 같은 세 부분으로 구성된 고전적인 형식입니다.

  1. 루프가 처음 발생할 때 변수가 초기화됩니다(i=1).
  2. 루프는 조건(i<=5) is true
  3. 루프를 돌 때마다 변수가 증가합니다(i++).

두 값 사이를 반복하는 것은 더 짧고 약간 덜 혼란스러운 대안이 있다는 충분히 일반적인 요구 사항입니다.

for i in {1..5}
do
echo $i
done

발생하는 중괄호 확장은 위의 for 루프를 다음과 같이 효과적으로 변환합니다.

for i in 1 2 3 4

Break and Continue로 더 정밀한 루프 제어

더 복잡한 for 루프는 종종 일찍 종료하거나 다음 값으로 메인 루프를 즉시 다시 시작하는 방법이 필요합니다. 이를 위해 bash는 다른 프로그래밍 언어에서 흔히 볼 수 있는 break 및 continue 문을 차용합니다. 다음은 100자보다 긴 첫 번째 파일을 찾기 위해 둘 다 사용하는 예입니다.

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

여기서 for 루프는 현재 디렉토리의 모든 파일에서 작동합니다. 파일이 일반 파일이 아닌 경우(예: 디렉토리인 경우) 계속 문을 사용하여 다음 파일로 루프를 차례로 다시 시작합니다. 일반 파일인 경우 두 번째 조건부 블록에서 100자를 초과하는지 확인합니다. 그렇다면 break 문을 사용하여 for 루프를 즉시 종료하고 스크립트의 끝에 도달합니다.

결론

bash 스크립트는 실행할 수 있는 명령 집합을 포함하는 파일입니다. for 루프를 사용하면 스크립트의 일부를 여러 번 반복할 수 있습니다. 변수, 외부 명령, break 및 continue 문을 사용하여 bash 스크립트는 더 복잡한 논리를 적용하고 광범위한 작업을 수행할 수 있습니다.

공유하다 공유하다 트위터 이메일 Windows 11로 업그레이드할 가치가 있습니까?

Windows가 새롭게 디자인되었습니다. 그러나 Windows 10에서 Windows 11로 전환하도록 설득하기에 충분합니까?

다음 읽기
관련 항목
  • 프로그램 작성
  • 리눅스
저자 소개 바비 잭(게시된 기사 58건)

Bobby는 거의 20년 동안 소프트웨어 개발자로 일한 기술 애호가입니다. 그는 게임에 열정적이며 Switch Player Magazine에서 리뷰 편집자로 일하고 있으며 온라인 퍼블리싱 및 웹 개발의 모든 측면에 몰두하고 있습니다.

바비 잭이 참여한 작품 더보기

뉴스레터 구독

뉴스레터에 가입하여 기술 팁, 리뷰, 무료 전자책 및 독점 거래를 확인하십시오!

구독하려면 여기를 클릭하세요.