반달가면 이글루에서 백업 - 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
'bash script' 카테고리의 다른 글
[bash: awk] 작업 시작전, 완료후에 실행할 명령어 지정(BEGIN/END) (0) | 2023.07.19 |
---|---|
[bash: awk] 조건에 따른 문자열 작업 (0) | 2023.07.19 |
[bash: sed] sed에서 영역 구분을 이용한 문자열 재구성 작업 (역슬래시-괄호) (0) | 2023.07.19 |
[bash: curl] ftp 접속에서 여러 서버 또는 여러 파일에 대한 업로드 자동화 (0) | 2023.07.19 |
[bash: grep] 바이너리 파일에서 16진수(hex) 데이터 검색하기 (0) | 2023.07.14 |