Skip to content

Bash:For

bash의 for문 사용방법에 대하여 정리한다.

Numeric ranges

아래와 같이 입력되는 숫자 목록을 나열할 수 있다.

for VARIABLE in 1 2 3 4 5 .. N
do
    command $VARIABLE
done

또는 아래와 같이 범위를 줄 수 있으며,

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

또는 아래와 같이 증가값을 변화할 수 있다.

for i in {0..10..2}; do
    echo "Welcome $i times"
done

비슷한 기능을 하는 seq 라는 명령행 도구도 있다.

Example

TDD를 적용하여, 테스트를 실패할 때 까지 N회 테스트를 하는 코드는 아래와 같다.

for i in {0..1000}; do ./tester --gtest_filter=RenderingLoop* || break; done

File list loop

아래와 같이 파일 목록을 나열할 수 있다.

for VARIABLE in file1 file2 file3
do
    command1 on $VARIABLE
done

또는 아래와 같이 와일드카드를 줄 수 있다.

for name in /path/to/imagenet/val/*.JPEG; do
    convert -resize 256x256\! $name $name
done

Commend output loop

for OUTPUT in $(Linux-Or-Unix-Command-Here)
do
    command1 on $OUTPUT
done

Array loop

python의 foreach 스타일 루프:

val=("1" "2" "3")
for i in ${val[@]}; do
    echo $i
done

c의 for 스타일 루프:

PLANETS=( "EARTH" "MARS" "VINUS" )
for (( i=0; i<${#PLANETS[@]}; i++ )); do
    echo "Planet #$i is ${PLANETS[i]}"
done

Text input loop

파일을 읽어들인 후 그 목록을 기반으로 LOOP를 돌린다.

for req in $(cat requirements.txt); do
    echo $req
done

입력 필드 구분자 변경

아래와 같은 파일이 존재한다 가정한다.

TEXT1\tBOAD1
TEXT2\tBOAD2

(중앙에 TAB문자가 존재한다.)

이 경우 일반적인 Text input loop를 적용하면 탭(\t)과 개행을 모두 구분자로 사용한다. 탭을 제외한 개행만을 구분자로 사용하고 싶을 경우 아래와 같이 IFS변수를 수정하면 된다.

IFS=$'\n'    # make newlines the only separator
for req in $(cat requirements.txt); do
    echo $req
done

find result loop

find명령으로 찾은 결과에 공백이 포함될 경우 다음과 같이 사용할 수 없다:

for f in $(find . -iname "*.ttf"); do
    echo $f
done

따라서 다음과 같이 사용해야 한다.

find . -iname '*.ttf' | while read f; do
    echo "Processing file: $f"
done

Three-expression bash for loops syntax

for (( c=1; c<=5; c++ ))
do
    echo "Welcome $c times"
    if [[ "$c" == "3" ]]; then
        break
    fi
done

Rename example

검색된 INDEX 순서로 파일 명칭을 바꾸는 스크립트는 아래와 같다.

DIR=directory_name
NAMES=`find $DIR -iname '*.jpg'`

val=0
for i in $NAMES; do
    mv "$i" "$DIR/$val.jpg"
    let "val = val + 1"
done

See also

Favorite site