adsense_in_article_test


[bash: read] read 명령의 요긴한 옵션 몇가지 리눅스 bash script

리눅스 shell script에서 키보드를 통한 사용자 입력을 변수에 저장하기 위해 read 명령을 사용하게 되는데, 몇가지 편리한 옵션이 있어서 정리해 두기로.

우선, 입력을 받을 때 안내문을 출력하기 위한 -p 옵션이다. echo 명령으로 출력한 후에 read 명령을 사용해도 되지만 -p 옵션을 사용하면 명령어 한줄로 해결되어 편리하다.

# 사용자 입력을 받아서 변수 val에 저장. 안내문 출력(-p 옵션)
read -p "값을 입력하세요: " val

또 하나 편리한 옵션은 사용자 입력이 일정 시간 동안 없으면 더 이상 기다리지 않고 다음으로 넘어가게 해 주는 -t 옵션이다. 기본값을 정해 놓고 사용자 입력이 없으면 기본값을 사용하도록 할 때 요긴하다. 아래의 예시를 보자. 변수 val에 0~9 사이의 수자를 입력해야 하고 20초간 입력이 없으면 기본값을 0으로 설정하는 경우다.

# 사용자 입력을 받아서 변수 val에 저장. 제한시간 20초
read -p "값을 입력하세요(20초 안에 입력하지 않으면 기본값 0으로 설정): " -t 20 val
# 입력값 검증: grep, wc 명령을 이용해서 입력값이 한자리 수자인지 확인
if [[ `echo $val | grep "^[0-9]$" | wc -l` -eq 0 ]]
  then echo "기본값 0으로 설정합니다."
    val=0
  else echo "입력된 값: $val"
fi


사용자가 엔터를 누르지 않아도 입력이 특정 길이에 도달하면 완료하게 할 수도 있다. -n 옵션을 이용해서 길이를 정하면, 사용자가 엔터를 누르거나 또는 해당 길이의 입력을 했을 때 완료된다. 즉, 입력 받을 수 있는 최대 길이가 4바이트가 된다. 아래의 예시를 보자.

# 사용자가 엔터를 누르거나 또는 4바이트를 입력하면 완료
read -n 4 val

길이는 제한하되 엔터를 무시하려면 -N 옵션을 이용하면 된다. -N 옵션을 사용할 경우 사용자가 (엔터를 포함해서) 무엇을 입력하던지 정해진 길이가 되면 완료된다.

# 사용자 입력이 4바이트가 되면 완료(엔터 무시)
read -N 4 val

read 명령의 본래 목적과는 다르지만 일정 시간 동안 기다릴 때 사용하는 sleep 명령을 read 명령으로 대체할 수도 있다. -N 옵션으로 엔터를 무시하게 하고 -t 옵션으로 기다릴 시간을 지정한다. 어차피 기다릴 목적으로 사용하므로 할당할 변수명을 지정하지 않는다. 아래의 예시를 보자.

# 10초간 기다림
read -t 10 -N 0

-N 옵션의 값을 0으로 하면, 입력 길이 제한이 없어져서 무한히 입력해도 ctrl-c를 누르지 않는 한 read 명령이 완료되지 않는다. 여기에 -t 옵션을 추가해서 10초 동안만 기다리고 완료하도록 한 것이다.

만약 스크립트를 백그라운드로 실행하는 경우에는 표준입력(stdin)이 없어지므로 위와 같은 형태로는 동작하지 않으며 read 명령에 인위적으로 입력값을 리다이렉션(redirection)해서 보내주어야 한다. 리눅스에서 0x00을 무한히 가지고 있는 형태인 특수 파일 /dev/zero를 보내주면 해결. 단, 이렇게 할 경우 CPU 점유율이 올라가므로 오랜 시간 기다려야 하는 경우에는 적합하지 않다는 점에 유의.
 
# 10초간 기다림 (스크립트가 백그라운드로 실행될 경우 사용)
read -N 0 -t 10 < /dev/zero




 

덧글

댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.


B-Side


adsense(w160_h600)2

통계 위젯 (화이트)

46756
4475
2082184

2019 대표이글루_IT

Google Analytics