簡単なスクリプトがあります
#!/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
これは、使用するほとんどの端末記述にある2つの端末機能を使用します。
- カーソル位置の保存/復元(
sc
そしてrc
パラメータ)と - 垂直地位(
hpa
範囲)。
そのエスケープシーケンスをハードコードできますが、そうすると読みやすくなります。
しかし、一部は上向き矢印エスケープを使用することを提案するかもしれませんが、これは画面の最後でスクロールするのと同じ問題があり、この問題も発生します\e[F
(CPL
端末の説明にはありません)。
水平に移動するには、パラメータで右カーソルを使用できます。たとえば、次のようになります。
tput cuf 20
これは〜になります\e[20C
。
質問の最後にコメントがあります\e[1a
ただし、ANSIエスケープシーケンスは大文字と小文字によって異なり、これは次のように一致します。\e[1A
(カーソルを1行上に移動)おそらくあなたはこのように考えています。
#!/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