본문 바로가기
기타/셸스크립트

[셸스크립트] for문의 스코프를 정하는 do와 done

by 일코 2024. 2. 10.

먼저 파이썬에서는 for문을 통한 반복문의 범위는
들여쓰기로 결정한다.(는 점은 다들 알고 계실 것)

#python3

for i in range(5):
    print(i)
print("Keep going!")  # 한 번만 출력됨

sh에서는 do와 done 사이에 반복 스코프를 넣으면 된다.

#!/bin/bash

for i in $*
do  # 들여쓰기 컨벤션이 궁금하다.
    echo $i
done
echo "Keep going!"

갑자기 궁금한 게 생겼다.

파이썬의 range 배열은 sh에서는 어떤 방식으로 만들 수 있을까?

ChatGPT에게 물어보자.

세미콜론이 왜 저 사이에 있는 건가 싶은데, do를 같은 줄에 넣으려고 그런 거겠지.

이건 뭐, 다른 언어랑 비슷해 보이는 문법이라서 생소하지는 않은데,
...괄호가 두 겹이네.

신기한 건 , `for i in $*` 처럼 사용할 수도 있고,
`for ((i=0; i<5; i++)); do` 처럼 사용할 수도 있다는 점?

전자는 파이썬 스타일, 후자는 자바 스타일 같은 느낌이다.
for문을 좀 더 파이썬스럽게 만들 수도 있는 것 같은데?
(ChatGPT가 seq에 대해 알려주었다.)

for i in $(seq 0 5); do
    echo $i
done

seq는 마지막 숫자도 포함하는구나

파이썬처럼 시작인덱스 생략도 가능할까?

#!/bin/bash

for i in $(seq 5); do
    echo $i
done

가능하다. 근데 0부터가 아니고 1부터네?

파이썬처럼 step도 있는 건 아니겠지? (어? 있다!ㅎ)
근데 $(seq start step end) 순서로 써야 한다.

#!/bin/bash

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

순서가 다른 점, 끝인덱스를 포함하는 점 빼고는.. 비슷하다.

슬슬 sh의 for문이 친근해지는 느낌이다.
파이썬 이전에 perl이 있었다고들 하지만,
sh랑 이렇게 비슷한 문법을 갖고 있는 게
신기하기도 하다. 특히
파이썬의 `for i in range(0, 10, 2):` 랑
sh의 `for i in $(seq 0 2 10); do`랑 비슷하다는 거.

마지막으로

이게 좋은 컨벤션인지 모르겠지만,
for문 안에 시퀀스(seq)를 사용할 때는 (어차피 스코프가 필요없으니)
do와 done을 쓰지 않아도 문제없이 잘 실행되는 것 같다.

#!/bin/bash

for i in $(seq 0 2 10)
    echo $i
echo "Finished"

이러면 정말 파이썬이랑 비슷해졌잖아?ㅎ

하나 더

seq 대신 중괄호로도 배열을 생성할 수 있다.

#$!/bin/bash

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

물론 중괄호 안에서도 스텝을 지정할 수 있다.

#!/bin/bash

for i in {1..10..2}  # 파이썬 range랑 비슷(start, end, step), seq와는 다르다는 점도 재미있다.
    echo $i

To be continued..

댓글