그래서 내 거래는 다음과 같습니다. BASH에서 작업하면서 배열 또는 임의 개수의 인수를 취하고 위쪽 또는 아래쪽 화살표를 통해 탐색할 수 있는 대화형 메뉴를 표시하는 기능 함수를 구축했습니다. 사용자가 클릭하여 입력을 종료합니다. , 원하는 메뉴 항목 강조 표시(출력은 메뉴 실행 방법에 따라 메뉴 항목의 색인 또는 값임):
모든 것이 잘 작동합니다. 메뉴를 렌더링한 다음 사용자 입력에서 명령에 대한 보이지 않는 프롬프트를 구문 분석하는 이벤트에 응답합니다 read
(3개의 문자를 수집한 후 자동으로 트리거됨).
read -s -n 3 key 2>/dev/null >&2
출력은 $key
변수에 공급된 다음 case
평가 문을 통해 실행됩니다. 예상되는 허용 가능한 입력은 다음과 같습니다. (
\033[A
위)
\033[A
(아래)
""
(입력) 이는 차례로 원하는 동작을 트리거합니다.
그러나 나는 7개 이상의 메뉴 항목이 도입되었기 때문에(우리는 아마도 10개 이하로 미리 설정했을 것임) 사용자가 원하는 메뉴 항목에 대한 숫자 항목을 클릭하도록 하는 것이 좋을 것이라는 것을 깨달았습니다. 문제가 있는제출할 필요가 없습니다.
내 질문은 이것입니다:
내 것도 잘 작동하지만 사용자는 필수 숫자 키(이 경우 5)를 입력한 다음 enter
해당 명령문에 대한 키를 눌러야 합니다. 이는 my read
덕분에 작동합니다. 사용성 모델은 다음과 반대됩니다. 물론 숫자 선택을 세 번 클릭하지 않는 한 그레인은 3자 최소 요구 사항을 트리거합니다(이 역시 직관에 어긋납니다).-n 3
read
질문0-9 는 단일 문자 \033[A
로 -n 3
처리됩니다(즉, 로 변경하면 -n 1
예상대로 작동하지만 이제 화살표 키가 실패하고 이스케이프 문자만 수집됩니다).
그래서 제가 알고 싶은 것은 다음과 같습니다. 를 들을 수 있는 방법이 있나요 -n 1 {OR} 3 (whichever comes first)
?문제가 해결될 때까지 아무런 효과가 없기 때문에 유사한 정보를 보내 \n
거나 \r
유사한 정보를 보낼 수 없는 것 같습니다 . 즉 , 병렬 프로세스를 실행하는 동안 입력한 값이 0-9인지 확인하기 위해 간단히 떠날 수 있는 방법을 찾지 못했다는 의미입니다. 입증됨) 단일 문자).read
-n 3
나는 이 접근법을 좋아하지 않습니다. awk
or 를 사용할 수 있습니다 sed
. expect
(마지막 단어가 아직도 헷갈리긴 하지만) read
수집에 대한 책임이 있는지 여부는 상관하지 않습니다 .
편집하다:
해결책
read -n1 c
case "$c" in
(1) echo One. ;;
(2) echo Two. ;;
($'\033')
read -t.001 -n2 r
case "$r" in
('[A') echo Up. ;;
('[B') echo Down. ;;
esac
esac
상태: 해결됨
@choroba가 구출하러 옵니다!
솔루션 설명
나는 설명하려고 노력할 것입니다 :
그의 해결책은 다음과 같습니다둥지이 두 read
명령문(순서대로 시도했습니다)은 정확히 이 작업을 수행하고 -t.001
(따라서 함수에 거의 즉각적인 시간 제한 설정) 이월 읽기를 활성화합니다.
내 문제는 내가 모니터링한 이스케이프 키의 길이가 3자라는 것입니다(따라서 내가 설정한 플래그 -n3
). 그 후에야 나는 특정한 사실을 받아들이는 것이 중요하다는 것을 깨달았습니다.하나의- 문자 입력에도 유리할 것입니다.
그의 해결책은 다음과 같은 사례를 만드는 것이었습니다 **($'\033')
.
원래
- '이스케이프 문자를 읽은 후...' (
**($'\033')
) Create another
read``(이번에는 두 문자를 기다림), 나노초 후에 시간 초과를 설정하고 이스케이프된 문자에서 백슬래시를 제외합니다.
이 동작은 read
분명히 나머지 입력을 "유출"하는 것이므로다음 read
찾고 있는 값이 시드될 때까지 카운트다운을 시작하는 문입니다. 정의된 요구 사항 플래그가 충족되었으므로 read
두 번째 문자 집합에 대한 사례를 테스트하는 것은 간단한 문제로 판명되었습니다. (그리고 비록 다른 명령문에서 왔음에도 불구하고 초기화 함수가 여전히 예상된 응답을 얻기 때문에 프로그램은 마치 다음과 같은 작업을 수행합니다. 처음부터 알아내려고 노력한 결과를 얻었습니다.
답변1
읽을 수 -n 1
있으며 첫 번째가 그렇다면 다음 두 개를 읽고 \033
그에 따라 반응하십시오. 그렇지 않으면 번호가 직접 처리됩니다.
#!/bin/bash
read -n1 c
case "$c" in
(1) echo One. ;;
(2) echo Two. ;;
($'\033')
read -t.001 -n2 r
case "$r" in
('[A') echo Up. ;;
('[B') echo Down. ;;
esac
esac