[완료] Escape 문자처리에 관해서 질문을 드리려고 합니다.

hyper9의 이미지

일단 현재의 환경은 Linux (Fedora)에서, Bash shell을 이용하고 있습니다.

간단하게
read -n 1 -p "TEST INPUT ?" key
if p [ "$key" = "a" ] ; then
echo "a key is pressed"
fi

이렇게 만들어서 실행하면, "a" key를 누를 때, "a key is pressed"라는 문구가 잘 print됩니다.

그런데, 예를 들면 Space bar를 누르면 "Space bar is pressed"라는 문구가 print
되도록 해보려고 하거든요.
그래서,,,
read -n 1 -p "TEST INPUT ?" key
if p [ "$key" = " " ] ; then
echo "Space bar is pressed"
fi
이렇게 해보면,, 계속 Key 입력을 받기만 하면서 "Space bar is pressed"라는 문구가 print되지를
않네요,,ㅜㅜ

혹시나 해서 위의 code를 아래와 같이 바꿔도 결과는 같은 것 같습니다.
SPACE=$'\040'
read -n 1 -p "TEST INPUT ?" key
if p [ "$key" = "$SPACE" ] ; then
echo "Space bar is pressed"
fi

이게 왜 이렇게 되는지 잘 이해가 되지 않아서 질문을 드리고 싶고요,
아울러서, Space Bar말고, "Enter" key도 같은 방법으로 처리해야 하는데
그것도 잘 안되는 것 같아서, 같이 조언을 구해보고 싶습니다.
미리 감사드립니다..

hyper9의 이미지

아래와 같이 해봤습니다.
Enter key가 주로 CR과 LF의 조합으로 처리되는 것 같아서요..
아래와 같이 두가지를 다 해봤습니다..
첫번째 Key가 CR이라고 가정하고 아래와 같이 해봤고요.
CR=$'\015'
read -n 1 -p "TEST INPUT ?" key
if p [ "$key" = "$CR" ] ; then
echo "Enter key is pressed"
fi

혹시 LF가 먼저 처리되는가 해서 아래와 같이도 해봤는데..
LF=$'\012'
read -n 1 -p "TEST INPUT ?" key
if p [ "$key" = "$LF" ] ; then
echo "Enter key is pressed"
fi

결국은 실패 였습니다. Enter key is pressed라는 문장이 print되질 않네요
무엇이 문제일까요 ~ ㅜㅜ

hyper9의 이미지

아무리 해도 안되길래..
이번엔 아래처럼 만들어서..

TEST=$'\000'
read -n 1 -p "TEST INPUT ?" key
if p [ "$key" = "$TEST" ] ; then
echo "Enter key is pressed"
fi

TEST에 000부터 차례대로 대입을 해볼까 했습니다.
그랬더니, 위와 같이 NULL문자로 TEST값을 지정하니까.
"Enter key is pressed"라는 문자가 찍히네요.

그런데, space bar를 입력해도 마찬가지로 "Enter key is pressed"가 찍히는데요.
찍히는 모양이 조금 다릅니다.

Space Bar를 입력하면
TEST INPUT? 옆에 바로 "Enter key is pressed"라는 문장이 같은 줄에 찍히고요

Enter Key를 입력하면,
TEST INPUT? 아래 줄에 "Enter key is pressed"라는 문장이 찍힙니다.

이건 왜 차이가 나는 걸까요?
지금 하고 싶었던 것은 "ENTER" key를 입력받으면 모두 무시해 버리려고 하는 중이거든요.
무시해 버리고 , "TEST INPUT ?"이라는 질문이 같은 줄에 계속 찍히면서 다음 입력을 기다
리도록 하려고 했는데,
이렇게 되니까,,Enter key를 입력하면 TEST INPUT? 이라는 문장이 아래줄에 하나 더 나오면서
다음 입력을 기다리고 계속 해서 "ENTER" key를 입력하면,,
화면에 "TEST INPUT?"이라는 문장이 계속 차례대로 display되어 버리네요.

조언을 주실분이 안계실까요 ~
쉽지 않네요 ~ㅜㅜ

bushi의 이미지

man test, 문자열 비교연산 설명.
man stty, 터미널 특성 중 echo 제어.

'터미널' 은 '키보드' 와는 아무 관련도 없습니다.
'vt220 을 지원하는 키보드' 이런 거 들어보셨습니까 ?

OTL

hyper9의 이미지

이런건 못들어 본것 같네요.

그리고, man test, man stty는 보고 있습니다만,
아직 어떤 걸 보라고, 이걸 알려주신건지는 잘 이해못하고 있습니다.
좀더 보다보면 뭐가 보일거라고 생각하고 더 보겠습니다.

bushi의 이미지

질문이 두 개 였습니다.

문자열비교가 희한하게 안되는 것 같다.
입력한게 화면에 그대로 출력되는 바람에 출력물이 이상해진다.

OTL

ymir의 이미지

쉘 변수에, white space 만 들어 있는 경우에는 empty string 으로 처리됩니다.

A="            "
if ! test $A ; then
  echo "A is not set"
fi

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

hyper9의 이미지

친절한 설명 감사드립니다..

read -n 1 -p "TEST INPUT ?" key

if ! test $key ; then
echo " ENTER is pressed "
fi

이렇게 해보았는데요 ,,,

이게 설명해 주신 걸 제가 제대로 이해한거라 생각하고요 ,,
하지만,,좀 문제가 있는데요 ,,

이렇게 하고, ENTER key와 Space Bar를 차례로 입력해 봤더니요.

Enter Key를 입력하는 경우는
TEST INPUT?
ENTER is pressed
이렇게 한줄 아래에 "ENTER is pressed" 가 찍혔고요

Space Bar를 입력하면요
TEST INPUT? ENTER is pressed처럼 같은 줄에 "ENTER is pressed"가 찍히거든요.

이 차이점 때문에 고민 중인데요 ..

정확히 하려고 했던 것은요..
TEST INPUT? 이라는 질문을 display하고,,
ENTER나, SPACE bar를 입력하는 경우는 그대로 다 filtering해버리고,
TEST INPUT? 이라는 질문을 같은 자리에 display하려고 하는데요 .

위와 같은 문제 때문에, SPACE bar를 입력하는 경우는 제대로 원하는대로 되는데요
ENTER key를 입력하면,,일단 한 줄아래로 Cursor가 떨어져버리는데요 ..
Cursor 가 떨어지기 전에 ENTER key를 filtering해버리고 싶거든요..

아뭏든 어려워서 고생 중 입니다..ㅜㅜ
다시 감사드립니다..

ymir의 이미지

prompt 를 계속해서 같은 자리에 출력하려고 하는건가요?
그렇게 만들어진 스크립트를 본 기억이 거의 없는 것 같은데...
단순 쉘 스크립트로는 어려울 것 같은 느낌이... ;;;
그냥 프롬프트 출력 전에 clear 시켜 버리면 비슷하게 흉내낼 수는 있을 것 같네요..

엔터를 입력했을 때, CR/LF 가 먹히는 것은 echo 가 켜져 있기 때문입니다.
간단하게 read 에 -s 옵션을 넣어서 echo 를 끄면 될 것 같네요.
부작용으로 입력한 다른 문자도 보이지 않겠지만...
입력 후에 echo -n ${key} 를 넣어주면 동일한 효과를 볼 수 있습니다.

while true
do
    clear
    read -n 1 -s -p "TEST INPUT ?" key
    if ! test $key ; then
        echo " white key is pressed "
    else
        echo -n "$key"
        echo " $key is pressed."
        break;
    fi
done

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

hyper9의 이미지

바로 해결되었네요 ^^

제가 원하던 답을 주셔서 정말 감사합니다.
아직 제가 모르는게 많아서, 어찌보면 간단할지도 모르는 곳에서
많이 시간을 소모했네요.

read에 "-s" option을 주는 걸로 해결되었습니다.

read man page를 한 두번 본것도 아닌데, 그 생각을 왜 하지
못했나 싶습니다.

암튼 다시한번 감사드립니다.

bushi의 이미지

read 의 -s 옵션으로 해결되지 않을 겁니다.
그토록 원하시는 PgDn/PgUp 은 말이죠.

OTL

hyper9의 이미지


이미 얼마전에 PgDn / PgUp은 해결되었었고요.
SpaceBar하고 Enter Key를 추가로 해결하려고 하다가
문제가 있었는데,,그건 위의 분이 조언을 주셔서 해결이 이제 막 되었네요

bushi의 이미지

제가 shell script 에 대해 오해를 하고 있었나봅니다.
read 로 대기하기 전에 입력된 것들은 read 가 처리 못 할 거라 생각했었거든요.
말이 좀 이상하긴한데... shell script 가 실행되는 순간부터 stdin 을 계속 잡고 있으니
-n 1 로 읽어도 입력을 잃어버리거나 하는 일이 없네요.

테스트에 사용한 스크립트 첨부합니다.
terminal type 이 xterm 일 경우에만 테스트했습니다.

OTL

댓글 첨부 파일: 
첨부파일 크기
Plain text icon key2.sh_.txt2.54 KB
hyper9의 이미지

요 며칠 또 딴거로 고민하느라 못 들어왔었는데,
조언 주셔서 감사합니다. ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.