9 Linux Bash 스크립트의 for 루프 예
주요 시사점
- Bash for 루프는 숫자, 단어, 배열, 명령줄 변수 또는 기타 명령의 출력으로 작업할 수 있는 다목적 도구입니다.
- 간단한 for 루프를 숫자 목록이나 단어 목록과 함께 사용할 수 있으므로 목록의 각 값에 대해 코드 섹션을 반복할 수 있습니다.
- for 루프는 숫자 범위, 파일 이름, 명령줄 매개변수, 단어 배열 및 연관 배열과 함께 사용할 수도 있어 스크립팅 작업에 유연성을 제공합니다.
다목적 Bash for
루프는 설정된 횟수만큼 반복하는 것 이상의 기능을 수행합니다. 우리는 귀하의 Linux 스크립트에서 성공적으로 사용할 수 있도록 다양한 변형을 설명합니다.
for 루프
모든 스크립팅 및 프로그래밍 언어에는 루프를 처리하는 방법이 있습니다. 루프는 반복적으로 실행하려는 코드 섹션입니다. 동일한 명령 세트를 스크립트 에 계속해서 입력하는 대신 루프가 코드의 한 섹션을 계속해서 반복합니다.
Bash for
루프는 매우 유연합니다. 숫자, 단어, 배열, 명령줄 변수 또는 기타 명령의 출력으로 작업할 수 있습니다. 이는 루프의 헤더에 사용됩니다. 헤더는 루프가 작동하는 대상(예: 숫자 또는 문자열)과 루프를 중지하는 종료 조건이 무엇인지 나타냅니다.
루프의 본문에는 반복하려는 코드가 포함되어 있습니다. 루프에서 수행하려는 작업을 보유합니다. 루프 본문에는 유효한 스크립트 명령이 포함될 수 있습니다.
루프 카운터 또는 반복자라는 변수는 값 범위 또는 데이터 항목 목록을 단계별로 실행하는 데 사용됩니다. 각 루프에 대해 반복자는 다음 숫자, 문자열 또는 루프가 반복하는 모든 데이터 유형의 값을 취합니다. 이를 통해 루프는 각 데이터 항목의 값을 차례로 작업하거나 어떤 경우에는 데이터 항목 자체를 조작할 수도 있습니다.
간단한 for 루프
첫 번째 for 루프를 작성하려는 경우 다음의 간단한 예제를 통해 시작할 수 있습니다.
숫자 목록을 사용하는 for 루프
for
명령줄에서 루프를 실행할 수 있습니다 . 이 명령은 간단한 for
루프를 만들고 실행합니다. 반복자는 이라는 변수입니다 i
. i
차례로 숫자 목록의 각 값을 할당 하겠습니다 . 루프 본문은 해당 값을 터미널 창에 인쇄합니다. 이 루프를 종료하는 조건은 i
전체 숫자 목록을 반복하는 경우입니다.
for i in 1 2 3 4 5; do echo $i; done
여기에서 루프가 회전할 때마다 변수가 i
1씩 증가한다는 점에 유의하는 것이 중요합니다. 하지만 이는 숫자 목록이 매번 1씩 증가하기 때문입니다.
이 숫자 목록은 3에서 시작하여 2단계로 증가한 다음 임의로 44로 도약합니다.
for i in 3 5 7 9 11 44; do echo $i; done
루프 에는 아무런 차이가 없습니다 for
. 목록의 한쪽 끝에서 시작하여 목록의 모든 값이 사용될 때까지 각 값을 차례로 사용합니다.
숫자가 오름차순일 필요도 없습니다. 순서는 상관없습니다.
for i in 3 43 44 11 9; do echo $i; done
단어 목록을 사용한 for 루프
우리는 말로도 쉽게 똑같이 할 수 있습니다. 스크립트의 텍스트를 편집기에 복사하여 “word-list.sh”로 저장합니다.
#!/bin/bashfor word in This is a sequence of wordsdo echo $worddone
스크립트를 실행 가능하게 만드는 데 사용해야 하며 chmod
이 문서에서 복사한 다른 스크립트도 필요합니다. 명령을 사용할 때마다 스크립트 이름을 대체하십시오 chmod
.
chmod +x word-list.sh
스크립트를 실행해 보겠습니다.
./word-list.sh
숫자와 마찬가지로 반복자(이 예에서는 변수)는 word
목록 끝에 도달할 때까지 데이터 항목 목록을 통해 작업합니다. 루프 본문은 변수의 값에 액세스하므로 word
목록의 각 단어가 처리됩니다.
숫자 범위가 있는 for 루프
루프를 100번 실행 하려면 for
루프 헤더에 100개의 숫자 시퀀스를 입력해야 하는 것이 꽤 성가신 일이 될 것입니다. 숫자 범위를 사용하면 첫 번째와 마지막 숫자만 지정할 수 있습니다.
이 스크립트는 “number-range.sh”입니다.
#!/bin/bashfor i in {1..10}do echo "Loop spin:" $idone
숫자 범위는 범위의 시작과 끝 숫자를 구분하는 {}
두 개의 마침표가 있는 중괄호 ” “로 정의됩니다. ..
범위 정의에 공백이 포함되지 않았는지 확인하세요.
실행 방법은 다음과 같습니다.
./number-range.sh
반복자가 범위의 숫자를 탐색하는 데 사용해야 하는 단계 크기를 정의하는 다른 숫자를 포함할 수 있습니다. 이 스크립트 “number-range2.sh”는 0~32의 범위와 4의 단계 크기를 사용합니다.
#!/bin/bashfor i in {0..32..4}do echo "Loop spin:" $idone
반복자는 4씩 점프하여 숫자 범위를 단계별로 진행합니다.
./number-range2.sh
파일 이름을 사용하는 for 루프
단어 목록을 처리할 수 있기 때문에 스크립트가 파일 이름과 함께 작동하도록 할 수 있습니다. 이 스크립트의 이름은 “filenames.sh”입니다.
#!/bin/bashfor file in word-list.sh number-range.sh number-range2.sh filenames.shdo ls -lh "$file"done
수행할 수 있는 작업만 수행하는 스크립트를 갖는 것은 꽤 의미가 없지만 ls
루프 본문 내부의 파일 이름에 액세스하는 방법을 보여줍니다.
./filenames.sh
숫자 범위를 사용하는 것과 비슷한 방식으로 루프 헤더의 파일 패턴을 사용하여 처리하려는 파일을 지정할 수 있습니다. 이렇게 하면 많은 타이핑을 피할 수 있으며 파일 이름을 미리 알 필요가 없습니다.
이 스크립트는 “filenames2.sh”라고 합니다. 현재 디렉터리의 모든 스크립트 파일에 대한 스크립트 보고서를 갖기 위해 파일 이름 목록을 파일 이름 패턴 “*.sh”로 대체했습니다.
#!/bin/bashfor file in *.shdo ls -lh "$file"done
출력은 다음과 같습니다.
./filenames2.sh
명령줄 매개변수를 사용하는 for 루프
명령줄에 파일 이름 패턴을 전달하면 유연성을 더 높일 수 있습니다. 변수 $*
는 스크립트에 전달된 모든 명령줄 매개변수를 나타냅니다.
이것은 “filenames3.sh”입니다.
#!/bin/bashfor file in $*do ls -lh "$file"done
“n”으로 시작하고 SH 확장자를 갖는 파일 이름을 요청합니다.
./filenames3.sh n*.sh
한 번에 두 개 이상의 패턴을 전달할 수도 있습니다.
./filenames3.sh n*.sh. bashrc
반복자 변수는 file
각 명령줄 매개변수의 값을 사용합니다. 파일 이름 패턴이 확장되고 모든 파일 이름이 루프 본문에서 처리됩니다.
C와 유사한 for 루프
Bash는 C 프로그래밍 언어에서 볼 수 있는 것과 같은 고전적인 3항 for 루프를 지원합니다. 루프 헤더에 3개의 용어가 있기 때문에 이를 3항 for 루프라고 합니다.
- 루프 반복자의 초기 값입니다.
- 루프가 계속되는지 아니면 끝나는지 테스트합니다.
- 반복자의 증가 또는 감소입니다.
이 스크립트는 “c-like.sh”입니다.
반복자는 I
루프 시작 시 1로 설정되며 ” “문이 참인 동안 루프는 실행됩니다 i<=10
. i
11 에 도달하자마자 for
루프가 중지됩니다. 반복자는 루프가 한 바퀴 돌 때마다 1씩 증가합니다.
#!/bin/bashfor ((i=1; i<=10; i++))do echo "Loop number:" $idone
이 스크립트를 실행해 보겠습니다.
./c-like.sh
C와 유사한 루프를 사용하면 약간 이상한 요구 사항이 있는 루프를 for
쉽게 만들 수 있습니다 . for
이 루프는 15에서 시작하여 3단계씩 역방향으로 계산됩니다. 이것은 “c-like2.sh”입니다.
#!/bin/bashfor ((i=15; i>0; i-=3))do echo "Loop number:" $idone
실행하면 세 단계씩 뒤로 점프해야 합니다.
./c-like2.sh
무한 for 루프
for
이 루프 형식을 사용하여 무한 루프를 만들 수도 있습니다 . 당신이 해야 할 일은 다음과 같이 루프 헤더에서 모든 요소를 제거하는 것뿐입니다. 이것은 “infinite.sh”입니다.
#!/bin/bashfor ((; ;))do echo "Press Ctrl+C to stop..." sleep 1done
루프를 중지하려면 Ctrl+C를 눌러야 합니다.
./infinite.sh
단어 배열을 사용한 for 루프
단어 배열을 쉽게 반복할 수 있습니다. 루프 헤더에 배열 이름을 제공해야 하며 반복자는 배열의 모든 항목을 탐색합니다. 이것은 “word-array.sh”입니다.
#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo echo $distrodone
모든 배포판이 나열됩니다.
./word-array.sh
계속 명령
루프가 특정 항목을 넘어가도록 하려면 반복자가 해당 항목과 일치하는지 테스트하고 명령을 사용하십시오 continue
. 이 continue
명령은 루프의 현재 회전을 포기합니다. 반복자를 증가시키고 루프의 다음 회전을 시작합니다. 건너뛰려는 항목이 목록의 마지막 항목이 아니라고 가정합니다.
이것은 “word-array2.sh”입니다. “Arch” 배열 항목을 건너뛰지만 다른 모든 배열 구성원을 처리합니다.
#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo if [[ "$distro" == "Arch" ]] ; then continue fi echo $distrodone
“Arch”는 터미널 창에 나타나지 않습니다.
./word-array2.sh
break 명령
명령 이 break
루프에서 벗어나 더 이상 처리되지 않도록 합니다.
continue
“word-array3.sh” 입니다. 로 바꿔서 이전 스크립트와 동일합니다 break
.
#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo if [[ "$distro" == "Arch" ]] ; then break fi echo $distrodone
반복자에 “Arch”가 포함되면 for 루프는 더 이상 처리를 중단합니다.
./word-array3.sh
연관 배열을 사용하는 for 루프
Bash 4 이상에서는 연관 배열을 사용하면 키 또는 값으로 검색할 수 있는 키-값 쌍 목록을 만들 수 있습니다. 키와 값 사이의 양방향 관계로 인해 데이터 사전이라고도 합니다.
루프 를 사용하여 연관 배열을 반복할 수 있습니다 for
. 이 스크립트는 “associative.sh”입니다. 이는 “dog”, “cat”, “robin” 및 “human” 각각에 대해 하나씩 4개의 항목이 있는 연관 배열을 정의합니다. 이것이 키입니다. 값은 각각이 가지고 있는 (기본) 다리 수입니다.
#!/bin/bashdeclare -A animals=([dog]=Four-legged [cat]=Four-legged [robin]=Two-legged [human]=Two-legged)for legs in ${!animals[@]}do if [ ${animals[$legs]} == "Two-legged" ]; then echo ${legs} fidone
반복자는 이라고 합니다 legs
. 루프 헤더에는 ” !
“느낌표가 포함되어 있습니다. 이는 논리적 NOT 연산자로 작동하지 않으며 연관 배열 구문의 일부입니다. 배열을 통해 검색해야 합니다.
루프 본문은 문자열 비교 테스트를 수행합니다. 배열 멤버의 값이 “Two-legged”인 경우 터미널 창에 키 값을 인쇄합니다. 이를 실행하면 스크립트가 두 다리 달린 생물을 인쇄합니다.
./associative.sh
명령 출력 반복
파일 이름과 같은 항목의 목록을 생성하는 명령 또는 명령 시퀀스가 있는 경우 루프를 사용하여 반복할 수 있습니다 for
. 예상치 못한 파일 이름 확장을 조심해야 하지만 간단한 경우에는 괜찮습니다.
이 스크립트는 “command.sh”입니다. 이 스크립트는 행, 단어 및 바이트 수와 함께 스크립트 파일 이름의 정렬된 목록을 제공하는 데 사용 ls
됩니다 wc
.
#!/bin/bashfor i in $(ls *.sh | sort);do echo $(wc $i)done
이를 실행하면 파일이 알파벳순으로 나열되어 각 파일에 대한 통계를 얻을 수 있습니다.
./command.sh
눈부신 for 루프
루프 for
는 다재다능하고 이해하기 쉬운 스크립팅 도구입니다. 하지만 유연성만큼 다른 루프에도 이유가 있다는 사실을 잊지 마세요. for
루프가 당신에게 필요한 전부라고 생각하는 것에 현혹되지 마십시오 .
예를 들어, 루프 는 파일에서 줄을 읽는 것과 같은 while
특정 작업에 루프보다 훨씬 더 적합합니다 .for
좋은 스크립트를 작성한다는 것은 현재 작업에 가장 적합한 도구를 사용하는 것을 의미합니다. 루프 for
는 트릭 도구 상자에 포함할 수 있는 훌륭한 도구입니다.
답글 남기기