85

私のbashスクリプトは次のようになります。

echo "Description:"
while [ $finishInput -eq 0 ]; do
  read tmp
  desc="$desc"$'\n'"$tmp"
  if [ -z "$tmp" ]; then
    finishInput="1"
  fi
done
echo -n "Maintainer:"
read maintainer

空の行が渡されるまで、descvarを読み取ります。その後、他のものを読みたいです。

現在のスクリプトを実行すると、次のようになります。

Description:
Line 1
Line 2

Maintainer:

最後の空の行を「Maintainer:」で上書きしたいと思います。

私は解決策を探しましたが、次のような提案しか見つかりませんでした

echo -n "Old line"
echo -e "\r new line"

これは回線に留まり、上書きします。私の場合、これは不可能です。

4

6 に答える 6

123

あなたの例では、同じ行のテキストを削除します。前の行に戻りたい場合は を使用し\e[1A、その行をクリアするには を使用します\e[K

echo 'Old line'
echo -e '\e[1A\e[Knew line'

並べたいときはN\e[<N>A

于 2012-07-01T16:24:06.693 に答える
19

Dennis Williamsons Commentから関数を作成しました:

function clearLastLine() {
        tput cuu 1 && tput el
}

デニス・ウィリアムソンに感謝

于 2014-12-05T23:59:50.303 に答える
1
#!/bin/bash

echo "Description:"
while test -z $finishInput; do
 read -s tmp
 desc="$desc"$'\n'"$tmp"
 if [ -z "$tmp" ]; then
 finishInput=1
 else
    echo $tmp
 fi
 #echo "fi="$finishInput;
done
echo -n "Maintainer:"
read maintainer

このソリューションは空行を回避しますが、行が完了する前に入力はエコーされません。

ヒント: 私のバージョンの bash は "[ $finishInput -eq 0 ]" を受け入れませんでした。

于 2012-07-01T16:47:46.923 に答える