Ubuntu 14.04 LTS 환경을 기준으로 작성되었습니다.
read
read는 표준 입력(파이프라인 입력 또는 키보드 입력)에서 한 줄의 내용씩 읽어 들이는 명령어이다.
#!/bin/bash
# read_input.sh
read input
echo "<${input}>을 입력하셨습니다."
$ echo "Hello World" | sh read_input.sh
<Hello World>을 입력하셨습니다.
$ sh read_input.sh
Hello World
<Hello World>을 입력하셨습니다.
while
을 이용해 표준 입력의 모든 줄을 읽을 수도 있다.
#!/bin/bash
# read_multiple_line.sh
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_promt.sh
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