bash에서 for 루프를 작성하는 방법


답변:


103

에서 이 사이트 :

for i in $(seq 1 10);
do
    echo $i
done

10
여기에 지정된 범위가 포괄적 이라는 것을 언급 할 가치가 있습니다 . 즉, 전체 범위 (1 ~ 10)가 콘솔에 인쇄되는 것을 볼 수 있습니다.
Jamie

62
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done

우리는 같은 변수가 있다면 ArrayLength=${#array[@]}우리가 여기 대신에 그것을 사용합니까 어떻게 max?
Kasun Siyambalapitiya

34

bash for는 변수 (반복자)와 반복자가 반복 할 단어 목록으로 구성됩니다.

따라서 제한된 단어 목록이있는 경우 다음 구문에 입력하십시오.

for w in word1 word2 word3
do
  doSomething($w)
done

아마도 일부 숫자를 따라 반복하고 싶을 것이므로 seq명령을 사용하여 숫자 목록을 생성 할 수 있습니다. (예 : 1에서 100까지)

seq 1 100

FOR 루프에서 사용하십시오.

for n in $(seq 1 100)
do
  doSomething($n)
done

$(...)구문에 유의하십시오 . 그것은 당신이 (에서 우리의 경우 한 명령의 출력을 전달할 수, 강타 행동의 seq다른를)합니다 ( for)

이것은 어떤 경로의 모든 디렉토리를 반복해야 할 때 매우 유용합니다. 예를 들면 다음과 같습니다.

for d in $(find $somepath -type d)
do
  doSomething($d)
done

목록 생성 가능성은 무한합니다.


2
좋은 대답이지만 for ((i = 0; i <MAX; i ++)); doSomething ($ i); 완료 변형도 있습니다. 후자는 실제로 루프를 실행하기 전에 먼저 0에서 MAX까지 모든 숫자를 생성하므로 $ (seq 0 MAX) 변형의 for i보다 일반적으로 선호한다고 생각합니다.
mweerden

30

Bash 3.0 이상 에서는 다음 구문을 사용할 수 있습니다.

for i in {1..10} ; do ... ; done

.. 시퀀스를 확장하기 위해 외부 프로그램을 생성하지 않습니다 (예 :) seq 1 10.

물론 이것은 for(())솔루션 과 동일한 문제를 가지고 있으며 bash 및 특정 버전에 묶여 있습니다 (이게 중요하다면).


14

bash기본 제공 도움말을 사용해보십시오 .


$ help for

for: for NAME [in WORDS ... ;] do COMMANDS; done
    The `for' loop executes a sequence of commands for each member in a
    list of items.  If `in WORDS ...;' is not present, then `in "$@"' is
    assumed.  For each element in WORDS, NAME is set to that element, and
    the COMMANDS are executed.
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
    Equivalent to
        (( EXP1 ))
        while (( EXP2 )); do
            COMMANDS
            (( EXP3 ))
        done
    EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is
    omitted, it behaves as if it evaluates to 1.



5
#! /bin/bash

function do_something {
   echo value=${1}
}

MAX=4
for (( i=0; i<MAX; i++ )) ; {
   do_something ${i}
}

다음은 이전 셸에서도 작동 할 수있는 동시에 많은 수에 대해 효율적인 예입니다.

Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'

그러나 행운의 내부에 유용한 일을 awk: 어떻게 내가 awk 스크립트에 쉘 변수를 사용합니까?


2
전에는 눈치 채지 못했지만 유사한 구문이 이전 답변 중 하나에 표시됩니다. 여기서 독특한 점은 일반적인 do/ done쌍 대신 중괄호를 사용하는 것입니다 .
Brent Bradburn 2013 년

4

나는 일반적으로 표준 for 루프에서 약간의 변형을 사용하는 것을 좋아합니다. 나는 종종 이것을 사용하여 일련의 원격 호스트에서 명령을 실행합니다. bash의 중괄호 확장을 이용하여 숫자가 아닌 for 루프를 만들 수있는 for 루프를 만듭니다.

예:

프런트 엔드 호스트 1-5와 백엔드 호스트 1-3에서 uptime 명령을 실행하고 싶습니다.

% for host in {frontend{1..5},backend{1..3}}.mycompany.com
    do ssh $host "echo -n $host; uptime"
  done

나는 일반적으로 위의 읽기 쉬운 버전 대신 줄 끝에 세미콜론이있는 한 줄 명령으로 실행합니다. 주요 사용 고려 사항은 중괄호를 사용하면 문자열에 삽입 할 여러 값을 지정할 수 있고 (예 : pre {foo, bar} post 결과는 prefoopost, prebarpost가 됨) 이중 마침표를 사용하여 계수 / 시퀀스를 허용한다는 것입니다 (a. .z 등). 그러나 이중 마침표 구문은 bash 3.0의 새로운 기능입니다. 이전 버전은이를 지원하지 않습니다.


이와 관련하여 $ host var가 실수로 빈 줄이면 어떻게 될까요? 여전히 ssh를 실행합니다. 그래서 어떻게 피할 수 있습니까? 제 경우에는 다른 일을하고 있으므로 귀하의 답변이 도움이 될 것입니다. Gmail에서 새 메시지를 확인하고있는 경우 보낸 사람과 제목에 대한 SMS를 보내려고합니다. 내 질문을 읽으려면 "두 개의 Bash 명령 연결"이라는 레이블이 붙어 있습니다.
Volomike

나는 당신이 빈 $ host var를 얻을 것이라고 믿지 않는다. 위의 예는 중괄호 확장을 사용하기 때문입니다. for 루프는 $ host 변수를 frontend1.mycompany.com frontend2.mycompany.com 값으로 명시 적으로 설정합니다. . backend1.mycompany.com 그러나 널 값을 갖는 방법을 본다면; 알고 싶습니다. 문제가되는 경우 조건부 테스트 내에서 ssh를 실행할 수 있습니다.
terson 2009

1

bash에서만 관심이있는 경우 위에 제시된 "for ((...))"솔루션이 가장 좋지만 모든 유니스에서 작동하는 POSIX SH 호환을 원한다면 "expr"을 사용해야합니다. "while", "(())"또는 "seq"또는 "i = i + 1"은 다양한 셸간에 이식 할 수 없기 때문입니다.


0

나는 파일을 처리하기 위해 항상 이것의 변형을 사용합니다 ...

* .log 파일의 경우; do echo "다음으로 작업 : $ files"; echo "$ files로 더 많은 작업 수행"; 끝난;

파일 목록 처리에 관심이있는 경우 파일 에 대한 -execdir 옵션을 살펴보십시오 .


나는 당신이 -execdir 찾기 옵션을 의미한다고 생각합니다
.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.