쉘 프로그램 엔터 입력 어떻게 받나요?
글쓴이: ehddms10 / 작성시간: 토, 2022/05/07 - 3:05오후
찾아보니까 ""로 받으시던데 제가 하니까 자꾸 오류가 나더라구요 방향키로 메뉴를 움직이고 엔터를 누르면 프로그램이 종료되게 짜봤습니다 뭔가 개같은 실수를 저지른거 같은데 뭐가 문제인지 잘 모르겠습니다 도와주십쇼
while : 96 do 97 read -s -n 1 input 98 if [ $input == "^[" ] 99 then 100 read -s -n 1 input 101 if [ $input == "[" ] 102 then 103 read -s -n 1 input 104 if [ $input == "B" ] && [ $state == 1 ] 105 then 106 btexit 107 elif [ $input == "C" ] && [ $state == 1 ] 108 then 109 signin 110 elif [ $input == "D" ] && [ $state == 2 ] 111 then 112 join 113 elif [ $input == "B" ] && [ $state == 2 ] 114 then 115 signout 116 elif [ $input == "A" ] && [ $state == 3 ] 117 then 118 join 119 elif [ $input == "C" ] && [ $state == 3 ] 120 then 121 signout 122 elif [ $input == "A" ] && [ $state == 4 ] 123 then 124 signin 125 elif [ $input == "D" ] && [ $state == 4 ] 126 then 127 btexit 128 fi 129 fi 130 elif [ $input == "" ] 131 then 132 exit 133 134 fi 135 done 136 }
Forums:
[ 조건 ] 식의 조건문을 모두[[ 조건 ]]
[ 조건 ]
식의 조건문을 모두[[ 조건 ]]
식으로 바꾸면 동작할 것입니다.아래의 코드는 input 변수가 "" 값을 가질때 오류가 발생합니다.
if [ "$input" == "^[" ]
식으로 수정해도 동작은 되는데, 그보다는 아래와 같이 하는게 효과적이라고 합니다. (참고: https://kldp.org/comment/641313#comment-641313).감사드립니다!!
감사드립니다!!
read 는 enter 키가 입력되면 입력을 중단
read 는 enter 키가 입력되면 입력을 중단 합니다.
즉, enter 키만 입력을 하면 빈 값을 변수에 저장(할당)하게 되는 거죠. 그래서 input 에 빈 값이 있을 경우로 검사를 하는 것입니다. 하지만 bash 의 비교문에서 "[" 부분이 syntax 가 아닌 command (/bin/[") 인 까닭으로 위와 같이 작성하였을 경우에는 문제가 됩니다.
의 경우, read input 에서 enter 만 입력을 했다면 input 에는 아무값도 할당이 되지를 않습니다.
그러므로 위의 코드는 다음과 같이 해석이 되어 버립니다.
"/bin/[" 명령은 command line argument를 4개를 가져야 하는데 $input 이 비어 버리니 3개가 되어 에러가 발생하게 되는 겁니다. 그래서 "/bin/[" 를 할 경우에는 아래와 같이 변수에 quoting 을 해 주어야 합니다.
아니면 "chanik"님이 언급하신 대로 "[" 대신에 "[[" 을 사용하면 이런 문제를 방지할 수 있습니다.
오래된 Bourne shell(sh)이라 dash 같은 shell 과의 호환을 걱정하는 것이 아니라면 비교문 사용시에 "[" 를 하는 것 보다는 "[["를 사용하는 것을 추천 합니다.
오 감사합니다
오 감사합니다
댓글 달기