Linux/Script

read enter 키 입력

728x90

shell script를 사용하여 프로그램을 작성하던 중 read를 사용하여 입력 값 중 enter 키 입력 시 프로그램이 에러가 발생한다. 그래서 예외 처리를 해야한다. 본 글은 그러한 방법에 대해 정리한 글이다.

 

일반적으로 read 명령어는 enter 키가 입력되면 입력을 중단한다.


왜냐하면 enter 키만 입력을 하면 빈 값을 변수에 저장하게 되기 때문에 input 에 빈 값이 있는 것으로 검사를 한다.

if [ $input == "^[" ]

위 코드의 경우 read input 에서 enter 만 입력을 했다면 input 에는 아무값도 할당이 되지를 않습니다.


그러므로 위의 코드는 다음과 같이 해석이 되어 버립니다.

if [ == "" ]

 if 문에서 사용하는 test 기호 "[" 는 실제 syntax 가 아니라 /bin/[ 명령이다.

https://serverfault.com/questions/138951/what-is-usr-bin

 

What is /usr/bin/[?

I was just poking around in /usr/bin and I found an ELF binary file called [. /usr/bin/[. I have never heard of this file and my first thought was that it was a clever way of hiding a program, poss...

serverfault.com

아래 명령어를 사용하면 [ 명령의 사용법을 출력합니다.

man [

"/bin/[" 명령은 command line argument를 4개를 가져야 하는데 $input 이 비어 버리니 3개가 되어 에러가 발생하게 된다. 그래서 "/bin/[" 를 할 경우에는 아래와 같이 변수에 quoting 을 해 주어야 한다.

if [ "$input" == "" ]

추가적으로  Bash 3부터 지원하는 "[[ ]]" syntax 를 사용하면 좀 더 가볍고 && || 연산 기호도 사용할 수 있다.

 

모든 최신 셸에는 [ 의 내장 구현이 되어있고, 일반적으로 외부 실행 파일(/bin/[ ) 로 되어 있습니다 . POSIX는 [ 에 대한 필수 기능 세트를 정의 하지만 거의 모든 셸이 이에 대한 확장을 제공한다. 따라서 이식 가능한 코드가 필요한 경우 에러가 발생하지 않게 확장을 사용하지 않도록 주의해야 한다.

"[["는 새롭고 개선된 버전이며, 프로그램이 아니라 키워드이다.

[ "$A" = "1" ] && [ -z "$B" ] && echo "y"
[ "$A" = "1" -a -z "$B" ] && echo "y"
[[ $A == 1 && -z $B ]] && echo "y"

예를 들어 위 문법의 경우 "[" 와 "[[" 문법의 가장 큰 차이중의 하나가 바로 -z "$B" 이다. "[" 를 이용한 테스트를 할 경우에는 -z 즉 $B 에 값이 없으면 -z 뒤에 인자가 없는 것으로 간주가 되어 에러가 발생하게 된다.

그러므로 꼭 변수 quoting을 꼭 주어야 하는데, "[[" 의 경우는 syntax 이기 때문에 빈 변수를 quoting 해 주지 않아도 된다는 장점이 있다.

bash2 와 같이 아주 오래된 legacy shell 을 사용하지 않는다면은 "[" 는 버리고 "[[" 를 사용하는 것이 더 좋다.

참고 :

https://mywiki.wooledge.org/BashFAQ/031

 

BashFAQ/031 - Greg's Wiki

What is the difference between test, [ and [[ ? The open square bracket [ command (aka test command) and the [[ ... ]] test construct are used to evaluate expressions. [[ ... ]] works only in the Korn shell (where it originates), Bash, Zsh, and recent

mywiki.wooledge.org

 

https://kldp.org/comment/641313#comment-641313

 

쉘 스크립트 조언 부탁드립니다. | KLDP

아래와 같이 찾는 값이 없는 경우 "could not found available IP"를 출력 해보려 하는데 조언좀 부탁드립니다. PS3="Select the option List or Exit " DATE=$(date +"%F")     select var in "1, List" "2, Exit"   do case $var in   1

kldp.org

 

https://stackoverflow.com/questions/2612274/bash-shell-scripting-detect-the-enter-key

 

Bash Shell Scripting - detect the Enter key

I need to compare my input with Enter/Return key... read -n1 key if [ $key == "\n" ] echo "@@@" fi But this is not working.. What is wrong with this code

stackoverflow.com

 

728x90

'Linux > Script' 카테고리의 다른 글

expect 명령어  (0) 2023.11.25