Làm cho văn bản biến mất sau khi người dùng nhập


9

Có cách nào để bạn có thể làm cho nội dung được hiển thị biến mất ngay sau khi người dùng đưa ra đầu vào không?

Ví dụ: lấy tệp này bên dưới

#!/bin/bash
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    echo 'Have fun'
else
    echo 'Go to Doctor'
fi

Nếu bạn chạy cái này, đầu ra là

how are you ? yHave fun

Tôi đang tìm kiếm thứ gì đó cho phép tôi how are you ?biến mất ngay khi người dùng nhấn phím

Và sau khi biến mất, in Have fun

Vì vậy, tôi muốn đầu ra cuối cùng của chương trình trên chỉ là

Have fun

Lưu ý: Ngoài ra, không nên xóa bất kỳ nội dung nào phía trên tập lệnh này trên màn hình hệ vỏ.

tôi đang dùng bash


2
sử dụng clearở giữa echokhông phải là một lựa chọn?
sebasth

1
Không, clearsẽ xóa đầu ra đã được in ở trên trên màn hình nếu có. @sebasth
GypsyCosmonaut

Nơi nào Are you fineđến từ đâu? Có nên như How are youvậy không?
Barmar

@Barmar yeah, xin lỗi đó là do nhầm lẫn, đã sửa ngay bây giờ
GypsyCosmonaut

Câu trả lời:


12

Bạn có thể dùng:

tput cr

(hoặc printf '\r') để di chuyển con trỏ đến đầu dòng. Theo dõi bởi:

tput el

để xóa mọi thứ cho đến cuối dòng. ( tcshzshcũng có echotcnội dung mà bạn có thể sử dụng termcaptương đương với terminfo el: echotc ce(cũng echoti eltrong zsh))


14

Sử dụng trả lại xe ngựa ( \r). Ký tự đặc biệt này (phần còn lại từ thời của máy đánh chữ cơ học) sẽ di chuyển con trỏ trở lại đầu dòng. Sau đó, bạn cần nhiều khoảng trống như tin nhắn bạn muốn xóa (điều này sẽ ghi đè lên tin nhắn) và sau đó một cỗ xe thứ hai quay trở lại từ đầu trước khi in tin nhắn tiếp theo. Một cái gì đó như thế này:

#!/bin/bash
echo foo
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    printf '\r                \rHave fun\n'
else
    printf '\r                \rGo to Doctor\n'
fi

Chạy đoạn script trên in:

$ foo.sh
foo
Have fun        

1
Thay vì hai \rbạn có thể đặt tất cả các khoảng trống giữa \rHave fun\n.
Barmar

2

Có một số cách để làm điều này, từ bằng chứng ngốc cho đến thanh lịch.

Phương pháp hoàn hảo nhất (mặc dù công việc nhiều nhất) là backspace không gian backspace được lặp lại tuy nhiên nhiều lần cần thiết. Điều này hoạt động trên tất cả mọi thứ trừ teletypes (loại bỏ mực khỏi giấy là một thách thức).

Tiếp theo quy mô là không gian vận chuyển trở lại vận chuyển trở lại. Điều này không hoạt động với các trình giả lập thiết bị đầu cuối chèn một nguồn cấp dữ liệu trước hoặc sau mỗi lần trả lại vận chuyển (đây là một tùy chọn tối thiểu và các tùy chọn khác có thể được cấu hình để có).

Sau đó, có các thủ thuật cụ thể của thiết bị đầu cuối, tôi sẽ chỉ đề cập đến các mã khả năng termcap như cơ sở dữ liệu termcap và terminfo có thể hiển thị việc sử dụng. (Đây là một danh sách.)

Đơn giản cho một dòng duy nhất là di chuyển đến cột (ch) theo sau là xóa đến hết dòng (ce).

Đối với các trường hợp phức tạp hơn bao gồm phản hồi nhiều dòng, có lưu vị trí tuyệt đối (sc), nhắc nhở, phản hồi đọc, khôi phục vị trí con trỏ (RC), xóa đến hết màn hình (cd).

Trong hầu hết các trường hợp, bạn có thể mã hóa các giá trị vt100 cho hai câu trả lời cuối cùng vì hầu hết các trình giả lập thiết bị đầu cuối đều tương thích với nó. Tất nhiên không phải tất cả các thiết bị đầu cuối đều hỗ trợ các tùy chọn đó, nhưng những thiết bị không hiếm và lỗi thời.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.