ทำให้ข้อความหายไปหลังจากที่ผู้ใช้ป้อน


9

มีวิธีที่คุณสามารถทำให้เนื้อหาที่แสดงหายไปหลังจากที่ผู้ใช้ป้อนข้อมูลหรือไม่

ตัวอย่างเช่นใช้ไฟล์นี้ด้านล่าง

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

หากคุณเรียกใช้สิ่งนี้ผลลัพธ์คือ

how are you ? yHave fun

ฉันกำลังมองหาบางอย่างที่ทำให้ฉันhow are you ?หายไปทันทีที่ผู้ใช้กดปุ่ม

และหลังจากหายไปพิมพ์ Have fun

ดังนั้นฉันต้องการผลลัพธ์สุดท้ายของโปรแกรมข้างต้นเป็นเพียง

Have fun

หมายเหตุ: นอกจากนี้สิ่งใดที่อยู่เหนือสคริปต์นี้ที่พิมพ์บนหน้าจอเชลล์ไม่ควรลบ

ฉันใช้ bash


2
ใช้clearในระหว่างechoไม่ได้ตัวเลือก?
sebasth

1
ไม่clearจะล้างผลลัพธ์ที่พิมพ์ไปแล้วด้านบนบนหน้าจอหากมี @sebasth
GypsyCosmonaut

ในกรณีที่ไม่Are you fineมาจากไหน? ไม่ควรจะเป็นอย่างนั้นHow are you?
Barmar

@Barmar ใช่ขอโทษด้วยความผิดพลาดแก้ไขทันที
GypsyCosmonaut

คำตอบ:


12

คุณสามารถใช้ได้:

tput cr

(หรือprintf '\r') เพื่อเลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัด ติดตามโดย:

tput el

เพื่อลบทุกอย่างจนถึงตอนท้ายของบรรทัด ( tcshและzshยังมีechotcbuiltin ซึ่งคุณสามารถใช้กับสิ่งtermcapนั้นได้terminfo el: echotc ce( echoti elในzsh)


14

ใช้การคืนสินค้า ( \r) อักขระพิเศษ (ส่วนที่เหลือจากวันที่ของเครื่องพิมพ์ดีดเชิงกล) จะเลื่อนเคอร์เซอร์กลับไปที่จุดเริ่มต้นของบรรทัด จากนั้นคุณต้องมีช่องว่างมากที่สุดเท่าที่ข้อความที่คุณต้องการลบ (ซึ่งจะเขียนทับข้อความ) จากนั้นสายการบินที่สองกลับมาเพื่อกลับไปที่จุดเริ่มต้นก่อนที่จะพิมพ์ข้อความถัดไป บางสิ่งเช่นนี้

#!/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

การเรียกใช้สคริปต์ด้านบนจะพิมพ์ออกมา:

$ foo.sh
foo
Have fun        

1
แทนของทั้งสอง\rคุณสามารถใส่ช่องว่างทั้งหมดระหว่างและ\rHave fun \n
Barmar

2

มีหลายวิธีในการทำเช่นนี้ตั้งแต่การพิสูจน์คนงี่เง่าไปจนถึงความสง่างาม

วิธีที่เข้าใจผิดได้มากที่สุด (แม้ว่าจะใช้งานได้มากที่สุด) คือ backspace space backspace ซ้ำหลายครั้ง วิธีนี้ใช้ได้กับทุกสิ่งทุกอย่างยกเว้นโทรศัพท์พิมพ์ดีด (การเอาหมึกออกจากกระดาษเป็นเรื่องที่ท้าทาย)

ถัดไปขึ้นไปบนเครื่องชั่งคือ carriage return space carriage return สิ่งนี้ไม่ทำงานกับอีมูเลเตอร์เทอร์มินัลที่แทรก linefeed ก่อนหรือหลังการขึ้นบรรทัดใหม่แต่ละครั้ง (นี่คือ minicom ของตัวเลือก

จากนั้นก็มีเทคนิคเฉพาะเทอร์มินัลที่ฉันจะพูดถึงเพียงรหัสความสามารถในการ termcap เป็นฐานข้อมูล termcap และ terminfo สามารถแสดงการใช้งาน (นี่คือรายการ)

ง่ายสำหรับบรรทัดเดียวคือย้ายไปที่คอลัมน์ (ch) ตามด้วยการล้างเพื่อสิ้นสุดบรรทัด (ce)

สำหรับกรณีที่ซับซ้อนมากขึ้นรวมถึงการตอบสนองแบบหลายบรรทัดจะมีการบันทึกตำแหน่งที่แน่นอน (sc), พร้อมท์, การตอบกลับการอ่าน, เรียกคืนตำแหน่งเคอร์เซอร์ (rc), ชัดเจนถึงจุดสิ้นสุดของหน้าจอ (cd)

ในกรณีส่วนใหญ่คุณสามารถ hardcode ค่า vt100 สำหรับสองคำตอบล่าสุดเนื่องจากเทอร์มินัลอีมูเลเตอร์ส่วนใหญ่เข้ากันได้กับมัน แน่นอนว่าไม่ใช่เทอร์มินัลทั้งหมดสนับสนุนตัวเลือกเหล่านั้น แต่สิ่งที่ไม่ยากและล้าสมัย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.