개인/리눅스

[리눅스]for 문 한줄로 사용하기

OmeGa2 2020. 4. 29. 18:29

기본적인 for문 사용

리눅스를 공부하는 사람이라면 기본적으로 프로그래밍 언어를 한 번쯤 사용하거나 보게 되는데, 프로그래밍의 기본이 되는 문법 중 하나가 for문입니다.

 

for문은 반복문으로 원하는 작업을 필요한 횟수만큼 돌아가도록 만들기 위해 사용하며, 각각 프로그래밍 언어마다 사용하는 방식이 조금씩 다르지만 기본적인 기능은 비슷합니다. 여기서는 리눅스에서 shell script에서 사용하는 문법을 사용하려고 합니다.

 

일반적으로 for문은 script 파일을 별도로 만든 뒤 사용하는데, 좀 더 효율적으로 사용하기 위해서 일반 명령어처럼 쉘 프롬프트에서 한 줄로 사용하는 방식을 권장합니다. 명령어만 복사해둔다면 좀 더 빠르고 쉽게 사용할 수 있을뿐더러 여기저기 응용하기 편합니다.

 

 

 

리눅스에서 일반적인 for문 사용

보통 for문은 script파일 작성 시 사용합니다.

 

 

1. script 파일 생성

 

"[파일명]. sh" 형식으로 원하는 파일 생성

 

<script 내용>

for i in [범위] = 범위의 값이 공백을 기준으로 차례대로 i에 대입됩니다.

do ~ done = 사이에 반복될 작업 지정

for 문은 반복문이라고 합니다. 어떤 행동을 반복하려고 할 떄 주로 사용됩니다.

 

위 스크립트 파일은 숫자 1, 2, 3을 차례대로 i에 대입한 뒤 i를 출력하는 파일입니다.

(1 → i = echo $i) = 1 출력 

(2 → i = echo $i) = 2 출력 

(3 → i = echo $i) = 3 출력

 

[sh ./test.sh] 명령으로 해당 위치에서 파일을 사용했을 때

1

2

3

이 기본적으로 출력될 수 있습니다.

 

 

 

2. 권한 변경

 

처음 생성한 script 파일은 사용 권한(x)이 없는 상태입니다.

따라서 사용할 수 있도록 권한을 변경해야 합니다. (권한이 바뀌면 파일명의 색이 바뀝니다.)

[chmod 755 test.sh] 명령을 통해 test.sh 파일의 권한을 755로 바꿀 수 있습니다. (권한은 0~7 지정가능)

이는 - rwx r-xr-x를 말합니다.

r은 읽기권한 4

w는 쓰기권한 2

x는 실행권한 1

 

 

 

 

3. script 파일 사용

 

script 파일을 사용할 때는 "./[파일명]" 형식을 사용합니다.

정상적으로 파일이 실행되고 "1 2 3"을 차례대로 출력하는 것을 확인할 수 있습니다.

 

 

 

 

 

명령어 한 줄로 for문 사용

script 파일로 만들어 for문을 사용하는 경우, 새로 작성한 뒤 권한을 바꾸는 등 번거로운 작업을 거쳐야 합니다. 지속적으로 파일을 사용하는 경우에는 문제없지만 한 번 간단한 작업을 위해서라면 한 줄로 for문을 사용하는 게 더 빠를지도 모릅니다.

 

<script와 한 줄 사용 비교>

for i in 1 2 3

do

    echo $i

done

= for i in 1 2 3;do echo $i;done

 

 

▶ 한 가지 작업 반복

 

script 파일 작성 시 줄 바꿈이 일어나는 부분은 세미콜론 ( ; )으로 표시합니다.

단, do와 반복할 내용 사이에는 줄 바꿈이 없어도 됩니다. (do echo $i)

 

 

 

▶ 두 가지 작업 반복

 

두 가지 이상 작업을 반복할 경우 마찬가지로 세미콜론을 사용합니다.

(echo $i;echo "hi")

for 문에 1,2,3을 순차적으로 놓고 그 뒤에 hi문자열을 같이 출력합니다. 마찬가지로 do와 반복할 내용 사이에서는 줄 바꿈이 없어도 됩니다.

for i in 1 2 3 ;do echo $i;echo "hi"; done 풀이

=================

for i in 1 2 3

do

    echo $i

    echo "hi"

done

=================

 1,2,3을 순차적으로 놓고 그 뒤에 hi란 문장도 반복적으로 출력합니다.

 

 

 

 

for 문 한 줄로 사용하기

for문을 사용할 때마다 일일이 스크립트 파일을 만들어서 사용하기엔 번거로움이 있습니다. 만약 for문을 한 줄로 사용할 수 있다면? 특히나 간단한 문장일수록 스크립트 파일을 만들어두는 것보다 명령어 한 줄을 복사해두는 것이 훨씬 간편하게 사용할 수 있을지도 모릅니다.

 

<파일을 이용한 for문 사용>

for i in $(명령어) ; do [반복할 작업] ; done

파일의 내용 및 명령어의 출력문을 이용해 for문을 사용할 수 있습니다.

 

 

 

1. 행 나누기 / 합치기

 

for문은 공백을 기준으로 하나씩 대입해서 원하는 작업을 반복합니다.

즉, 공백을 기준으로 텍스트를 나누거나 합치는 게 가능합니다.

 

공백을 기준으로 행 나누기

]# for i in $(cat test);do echo $i ;done

= test 파일의 내용을 공백을 기준으로 하나씩 대입해서 출력합니다.

 

원해 한 행으로 있던 "aa bb cc"를 공백이 기준이 되어 세 개의 행으로 나누어집니다.

이후 리다이렉션 (>>)을 이용해 별도의 파일을 만들어 따로 저장할 수 있습니다.

 

 

 

여러 행을 하나로 합치기

]# for i in $(cat test); do echo -n $i ;done

= test 파일의 내용을 공백을 기준으로 하나씩 출력하고 개행을 제거합니다.

 

개행을 제거함으로써 세 개의 행으로 나누어져 있던 내용을 하나로 합칠 수도 있습니다.

(echo -n $i = i 변수의 내용을 출력하면서 -n 옵션이 개행을 제거합니다.)

 

이후 좀 더 보기 편하게 만들기 위해 출력이 모두 끝난 뒤 for문을 빠져나와 개행을 추가합니다.

(echo -e "\n")

 

 

 

2. 파일에 반복적인 문자 삽입

 

공백을 기준으로 같은 문자를 삽입합니다.

 

]# for i in $(cat test);do echo $i"%" ;done

= 공백을 기준으로 출력되는 각각의 문자 뒤에 "%" 삽입

 

echo 명령을 사용하는 방법을 알고 있다면 얼마든지 응용할 수 있는 부분입니다.

문자를 삽입할 때 따옴표 (""), 역슬러쉬 (\) 등을 사용합니다.

 

 

 

3. 특정 문자를 기준으로 행 나누기

 

for 문에 들어갈 명령어를 어떻게 사용할지에 따라서 얼마든지 응용할 수 있습니다.

 

]# for i in $(cat test | sed 's/;/ /g');do echo $i ;done

= test 파일에서 세미콜론 ( ; )을 제거한 뒤 공백을 기준으로 나눠서 출력

 

스트림 편집기라 불리는 sed 명령은 출력문을 각 행마다 읽어 들이고 편집할 수 있습니다.

즉, 한 행에서 특정 문자를 치환하거나 제거할 수 있습니다.

 

출력문을 봤을 때, 기존의 test 파일에서 세미콜론을 지운 뒤

자연스레 공백이 만들어지면서 5개의 행으로 나뉘는 것을 확인할 수 있습니다.