간단한 스크립트가 있습니다
#!/bin/bash
SENTENCE=""
while read word
do
SENTENCE="$SENTENCE $word"
done
사용자와의 상호 작용으로 인해 다음이 발생할 수 있습니다.
a
a
b
a b
c
a b c
d
a b c d
사용자와 같은 줄 오른쪽에 문자열을 표시하여 출력을 얻는 방법
a a
b a b
c a b c
d a b c d
답변1
가장 간단한 경우(짧은 단어 하나, 줄 바꿈 없음, 화면 끝까지 스크롤할 걱정 없음)를 가정하면 다음을 수행할 수 있습니다.
#!/bin/bash
SENTENCE=""
tput sc
while read word
do
SENTENCE="$SENTENCE $word"
tput rc
tput hpa 20
printf '%s\n' "$SENTENCE"
tput sc
done
이는 사용하게 될 대부분의 터미널 설명에 있는 두 가지 터미널 기능을 사용합니다.
- 커서 위치 저장/복원(
sc
그리고rc
매개변수) 및 - 수직적 지위(
hpa
범위).
해당 이스케이프 시퀀스를 하드코딩할 수 있지만 그렇게 하면 가독성이 저하됩니다...
그런데 일부에서는 위쪽 화살표 이스케이프를 사용하도록 제안할 수도 있지만 이는 화면 끝에서 스크롤하는 것과 동일한 문제가 있으며 이 문제도 발생합니다 \e[F
( CPL
, 터미널 설명에 없음).
수평으로 이동하려면 매개변수와 함께 오른쪽 커서를 사용할 수 있습니다. 예를 들면 다음과 같습니다.
tput cuf 20
이것은 ~이 될 것이다 \e[20C
.
질문 끝에 댓글이 있습니다\e[1a
, 그러나 ANSI 이스케이프 시퀀스는 대소문자에 따라 다르며 이는 다음과 일치합니다.\e[1A
(커서를 한 줄 위로 이동) 아마도 당신은 이렇게 생각하고 있을 것입니다.
#!/bin/bash
SENTENCE=""
while read word
do
SENTENCE="$SENTENCE $word"
tput cuu1
tput hpa 20
printf '%s\n' "$SENTENCE"
done
이 것보다 읽기가 더 쉽습니다.
#!/bin/bash
SENTENCE=""
while read word
do
SENTENCE="$SENTENCE $word"
echo -en '\e[A'
echo -en '\e[20C'
echo "$SENTENCE"
done