쉘 스크립트(Shell Script) 기초(5) - read

Ubuntu 14.04 LTS 환경을 기준으로 작성되었습니다.

read

read는 표준 입력(파이프라인 입력 또는 키보드 입력)에서 한 줄의 내용씩 읽어 들이는 명령어이다.

#!/bin/bash

read input  
echo "<${input}>을 입력하셨습니다."  
$ echo "Hello World" | sh read_input.sh
<Hello World>을 입력하셨습니다.  
$ sh read_input.sh
Hello World  
<Hello World>을 입력하셨습니다.  

while을 이용해 표준 입력의 모든 줄을 읽을 수도 있다.

#!/bin/bash

count=1  
while read line  
do  
  echo "${count}번째 줄은 <$line>입니다."
  count=$(($count + 1))
done  
$ cat test.txt | sh read_multiple_line.sh
1번째 줄은 <Apple>입니다.  
2번째 줄은 <Orange>입니다.  
3번째 줄은 <Melon>입니다.  

프롬프트 출력하기

-p 옵션을 사용해 프롬프트를 출력할 수도 있다.

#!/bin/bash

read -p "성은? > " last_name  
read -p "이름은? > " first_name  
echo "성은 ${last_name}이고, 이름은 ${first_name}입니다."  
$ sh read_promt.sh
성은? > 주
이름은? > 승환
성은 주이고, 이름은 승환입니다.

echo의 -n 옵션을 이용해서도 똑같은 결과를 얻을 수 있다. 이 방식은 프롬프트 부분과 문자 입력 부분을 확실하게 구분할 있고, 프롬프트의 문자 색을 변경할 수 있다는 장점이 있다.

#!/bin/bash

echo -n "성은? > "  
read last_name  
echo -n "이름은? > "  
read first_name  
echo "성은 ${last_name}이고, 이름은 ${first_name}입니다."  

공백이 들어있는 파일명을 반복문에 사용하기

$ find . -name "my *"
./my movie.txt
./my music.txt
./my picture.txt

현재 디렉토리에서 "my"로 시작하는 파일 3개를 모두 삭제하는 스크립트를 만들려고 한다.

#!/bin/bash

for file in $(find . -name "my *")  
do  
  rm file 
done  

위의 스크립트를 실행하면 해당 파일을 찾을 수 업다는 에러가 발생할 것이다. 왜냐하면 for 반복문은 기본적으로 공백을 구분자로 하여 항목을 순서대로 처리하기 때문이다. 따라서 지금처럼 파일명에 공백이 있는 경우 find 명령어의 결과 ./my movie.txt ./my music.txt ./my picture.txt./my, movie.txt, ./my, music.txt, ./my, picture.txt 6개의 항목으로 구분되어 처리되게 된다.

이 때 read 명령어의 한 줄씩 읽는 특성을 이용하면 쉽게 해결할 수 있다.

#!/bin/bash

find . -name "my *" |  
while read file  
do  
  rm "$file"
done  

출처