bash script2023. 7. 19. 08:50

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/589023

 

리눅스 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

 

 

728x90
Posted by 반달가면