Bash의 For 및 Read-While 루프

반복 작업을 수행하는 프로그램 설계

루프는 컴퓨팅에서 가장 기본적이고 강력한 구조 중 하나입니다. 선택한 항목 목록에 대해 원하는만큼 명령 집합을 반복 할 수 있기 때문입니다. 많은 계산적 사고는 하나의 작업을 취하고 다른 모든 유사한 작업에 반복적으로 적용될 수있는 방식으로 해결하는 것을 포함하며 for 루프는 컴퓨터가 그 반복적 인 작업을 수행하도록 만드는 방법입니다.

지금까지 대화 형 프롬프트에서 작성한 대부분의 코드와 달리 for 루프는 Enter 키를 누르 자마자 실행되지 않습니다.

dodone 키워드 사이의 블록에 원하는만큼 명령을 작성할 수 있습니다. :

done에 도달하고 Enter 키를 누를 때까지만 for 루프가 작동합니다.

이것은 우리가 지금까지 프롬프트에서 경험 한 줄별 명령 및 응답과 근본적으로 다릅니다. 그리고 우리가 프로그래밍 할 방법을 예고합니다. 명령을 실행하는 데 덜 중점을 둡니다. 프로그램의 기능을 계획하고 나중에 실행하는 데 더 중점을 둡니다.

기본 구문

for 루프의 구문은 혼란 스러울 수 있으므로 다음은 이해를 준비 / 갱신하는 몇 가지 기본 예입니다.

다음은 변수를 사용하는보다 정교한 버전입니다.

명령 대체를 사용하여 생성 할 수 있습니다. for 루프가 반복되는 항목 :

A에서 줄 목록을 읽어야하는 경우 파일에 공백이없는 줄을 절대적으로 확인합니다.

read-while 루프는 위의 변형이지만 파일에서 줄을 읽는 데 더 안전합니다.

기본 for 루프 구성

매우 처음부터 시작하겠습니다. 최소한의 for 루프를 만든 다음 더 정교한 루프를 만들어 목적을 이해하는 데 도움이됩니다.

가장 간단한 루프

이것은 간단합니다 for 루프를 만들 수 있습니다.

꽤 쓸모가 없어 보였나요? 네, 그래야합니다. 한 줄로 작업을 수행하기 위해 네 줄의 코드를 작성했습니다. echo "Hi".

컬렉션의 추가 요소

It “말하기 어렵지만”루프 “가 실행되었습니다. 한 번만 실행되었습니다. 좋아, 두 번 이상 실행하려면 어떻게해야합니까? in 키워드입니다. 네 개의 1 “를 더 추가하겠습니다.

네,별로 흥미롭지는 않지만 프로그램이 적어도 반복되는 것 같았습니다. 네 개의 1 “가 네 개의 echo 명령을 실행했습니다.

이 네 개의 1 “를 다른 숫자로 바꾸면 어떻게됩니까? 그리고 몇 개의 단어로 대체 할 수 있습니까?

그리고… 아무것도 없습니다. 따라서 루프는 우리가 제공 한 값 모음과 관련된 특정 작업을 자동으로 수행하지 않습니다. 어쨌든 아직 아닙니다.

루프 변수 참조

in 키워드의 왼쪽을 살펴 보겠습니다. div id = “9ef60e5caf”> . x의 요점은 무엇입니까? 소문자 x는 “지금까지 발견 한 키워드 또는 명령의 이름이 아닙니다 (그리고 프롬프트에서 단독으로 실행하면 오류가 발생합니다). 변수일까요? echo 문에서 참조 해 보겠습니다.

Bingo. 이것은 for 루프의 거의 기본적인 작업입니다.-항목 / 값 모음 (Q Zebra 999 Smithsonian)을 가져옵니다. for 루프 구성-루프 변수 (x)를 자리 표시 자로 사용하여 do / done 블록.-루프가 실행되면 루프 변수 인 x가 각 항목의 값을 가져옵니다. 목록 – Q, Zebra, 999, Smithsonian, – 그리고 dodone 사이의 명령 블록이 실행됩니다. 이 시퀀스는 목록의 모든 항목에 대해 한 번씩 반복됩니다.

do / done 블록은 명령, 다른 for -loop :

루프 내 루프는 프로그래밍에서 일반적인 구성입니다.대부분의 경우 디버깅하는 동안 뒤틀림을 풀기가 까다로울 수 있으므로 이런 종류의 논리와 관련된 문제를 할당하지 않으려 고합니다.

파일을 한 줄씩 읽고, 읽는 동안 안정적으로

cat는 파일을 한 줄씩 인쇄하기 때문에 다음 for 루프가 합리적으로 보입니다.

그러나 명령 대체로 인해 cat가 단어를 공백으로 분할합니다. list-of-dirs.txt에 다음 :

for 루프의 출력은 다음과 같습니다.

while 읽기 루프는 한 줄 내의 단어를 보존합니다.

결과에서 파이프 할 수도 있습니다. 명령을 <()로 묶어 :

파이프 및 루프

다른 언어에서 온 경우 데이터 스트림이 익숙하지 않을 수 있습니다. . 적어도 그것들과 함께 작업하는 구문은 Ruby 나 Python보다 Bash에서 훨씬 더 직접적이고 간단하기 때문입니다.

하지만 어떤 언어로든 프로그래밍을 처음 접한다면 어떻게 될까요? 또한 데이터 스트림 작업이 루프 작업과 어떻게 다른지 명확하지 않습니다.

예 : 다음 스 니펫 :

– 다음 루프와 동일한 출력을 생성합니다.

그리고 사물의 정신적 모델에 따라 두 예에서 각 단어, 예를 들어 hello, world는 번역 프로세스 (tr를 통해)를 통과 한 다음 에코됩니다.

파이프와 필터

파이프가 루프와 근본적으로 다른 작동을하는 Unix 시스템의 기초에 들어 가지 않고 정신적 해결 방법을 제안하겠습니다.

표준 입력 및 표준 출력에서 파이프하는 프로그램은 일반적으로 필터로 정렬 할 수 있습니다. 프로그램에 들어가서 다른 형식으로 나옵니다.

필터에서 필터로 데이터를 변환하는 것 이상의 작업의 경우 루프 사용을 고려하십시오. 과업은 무엇일까요? URL 목록이 주어지면 각각을 다운로드하고 다운로드 한 데이터를 사용자 정의 된 본문 및 제목과 함께 이메일로 보냅니다.

데이터 입력 소스, urls.txt의 각 URL, 여기서는 실제로 필터링되지 않습니다. 대신 각 URL에 대해 다단계 작업이 수행됩니다.

read-while로 파이프하기

즉, 루프 자체를 구현할 수 있습니다. 필터 중 하나 이상의 필터입니다. echo | grep의 결과가 한 줄씩 루프 : echo를 사용하여 stdout으로 인쇄하며 some.txt라는 파일로 리디렉션됩니다.

이것은 자주 수행해야하는 구조는 아니지만 Unix에서 파이프 사용을 강화하기를 바랍니다.

대화 형 프로그래밍이 적습니다.

The for 루프 및 유사한 구문을 자주 사용한다는 것은 c의 한 줄에 입력 한 “올바른 ol”일을 지나고 있음을 의미합니다. ommands 및 Enter 키를 누른 직후에 실행되도록합니다. for 루프 안에 얼마나 많은 명령을 넣든 상관없이 done 키워드를 찾을 때까지 아무 일도 일어나지 않습니다.

한 번 작성하십시오. 그런 다음 루프

셸과의 라인 별 상호 작용이 손실되면 대화 형 프롬프트의 주요 이점 인 즉각적인 피드백을 잃게됩니다. 그리고 여전히 모든 단점이 있습니다. dodone 사이의 명령 블록에서 더 일찍 오타를 만들면 시작해야합니다.

그를 완화하는 방법은 다음과 같습니다.

한 번에 하나씩 코드 테스트

초보자가 저지르는 가장 큰 실수 중 하나 for 루프는 for 루프가 즉시 문제를 해결한다고 생각하는 것입니다. 따라서 그들이해야 할 일은 10,000 개의 URL을 다운로드하는 것이지만 하나의 URL 만 제대로 다운로드 할 수 없으며 결함이있는 명령을 for 루프에 넣는 것이 올바른 방향으로 나아가는 단계라고 생각합니다.

for 루프에 대한 오해, 실제 문제는 이제 손상된 코드를 10,000 번 실행하고 있다는 것입니다. 즉, 코드가 다음과 같은지 확인하려면 10,000 번 더 기다려야합니다. 아아, 여전히 고장났습니다.

그러니 “for 루프. 한 번에 한 명령 씩 10,000 개의 URL을 모두 다운로드해야한다고 가정합니다. 첫 번째 URL에 대해 명령을 작성할 수 있습니까? 두 번째는 어때? 사소한 구문 오류가 발생하지 않는다는 확신이 들면 9,997 개의 다른 URL에 대한 일반적인 패턴을 찾는 방법에 대해 생각할 때입니다.

스크립트 작성

대화 형 명령 줄은 훌륭합니다.처음 시작하는 것은 재미 있었고 “컴퓨팅 경력 내내 재미있을 것입니다.하지만 10 줄 이상의 코드를 포함하는 큰 작업이 눈앞에있을 때, 그 코드를 쉘 스크립트. 오류가있는 사람의 손가락이 코드를 완벽하게 다시 입력한다고 믿지 마세요.

nano를 사용하여 루프 작업을하고 쉘로 저장하세요. 더 긴 파일의 경우 컴퓨터의 텍스트 편집기 (Sublime Text)로 작업 한 다음 서버에 업로드합니다.

웹 스크래핑으로 연습

for-loop의 구문과 작동, 여기에 일상적인 작업을 루프로 전환하는 사고 과정이 있습니다.

1에서 10까지의 숫자에 대해 curl을 사용하여 각 번호에 대한 Wikipedia 항목을 다운로드하고 “wiki-number-(whatever the number is).html

구식 방식

단지 10 개의 URL로 몇 개의 변수를 설정 한 다음 a curl 명령을 10 번 복사하여 붙여 넣어 각 줄을 변경할 수 있습니다.

그리고 무엇을 추측합니까? 효과가있다. 10 개의 URL에 대해서는 나쁜 해결책이 아니며 구식 방식 (웹 브라우저에서 수행)보다 훨씬 더 빠릅니다.

반복 줄이기

루프에 대해 생각하지 않아도 변수를 사용하여 반복을 줄일 수 있습니다. 기본 URL, 및 기본 파일 이름은 절대 변경되지 않으므로 이러한 값을 변수에 할당 해 보겠습니다. 재사용 가능 :

for 루프 적용

이 시점에서 우리는 지금까지 패턴을 단순화하여 각각의 개별 작업에서 얼마나 작은 변화가 있는지 확인할 수 있습니다. for -loop에 대해 배운 후에는 별 생각없이 적용 할 수 있습니다 (웹 요청 사이에 일시 중지 할 수 있도록 sleep 명령도 추가)

list

대부분의 상황에서 for 루프를 만드는 것은 쉽습니다. 어려운 작업이 될 수있는 목록의 생성입니다. 1부터 100까지의 페이지를 수집하고 싶다면 어떨까요? 그것은 “많은 타이핑입니다.

하지만 우리의 게으름이 지시하도록한다면 x에서 y까지 세는 것이 본질적으로 계산 작업처럼 보인다고 생각할 수 있습니다. 그리고 유닉스에는이를위한 seq 유틸리티가 있습니다.

반복을 위해 숫자가 아닌 목록 생성

많은 반복 작업 x에서 y까지 세는 것만 큼 간단하지 않습니다. 따라서 문제는 항목의 비선형 목록을 생성하는 방법이됩니다. 이것이 기본적으로 데이터 수집 및 관리 기술입니다. 그러나 다음을위한 간단한 시나리오를 만들어 보겠습니다. 우리 자신 :

현재 NYTimes.com 첫 페이지의 헤드 라인에 적어도 한 번 나타나는 10 글자 (또는 그 이상) 단어 중 10 개에 대해 해당 단어에 대한 위키 낱말 사전 페이지 가져 오기

이 작업을 두 부분으로 나눕니다.

  1. 10 개의 목록 가져 오기 nytimes.com 헤드 라인의 + 글자 단어
  2. for-loop에 해당 단어 전달

1 단계 : pup 유틸리티 (또는 명령 줄 HTML 파서 선택) :

2 단계 (words 변수가 전달되고 있다고 가정) :

Softwa 확인 re Carpentry의 Bash for 루프에 대한 훌륭한 가이드

Leave a Reply

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다