ข้อความตัวหนาหนึ่งเอาต์พุตใน Bash เป็นอย่างไร


241

ฉันกำลังเขียนสคริปต์ Bash ที่พิมพ์ข้อความไปที่หน้าจอ:

echo "Some Text"

ฉันสามารถจัดรูปแบบข้อความได้ไหม? ฉันต้องการทำให้เป็นตัวหนา

คำตอบ:


427

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

bold=$(tput bold)
normal=$(tput sgr0)

จากนั้นคุณสามารถใช้ตัวแปร$boldและจัด$normalรูปแบบสิ่งต่าง ๆ :

echo "this is ${bold}bold${normal} but this isn't"

จะช่วยให้

นี่เป็นตัวหนาแต่ไม่ใช่


2
นั่นเป็นสิ่งที่ดีงาม หากฉันเข้าใจอย่างถูกต้องนี่จะเหมือนกับการแทรกทางหนี แต่มันจะทำงานในเทอร์มินัลอื่น (ไม่ใช่ VT100)
JamesRat

ถูกต้อง - ค้นหารหัสที่เหมาะสมตามมูลค่าของ TERM
psmears

2
หากคุณต้องการขีดเส้นใต้ข้อความคุณสามารถเพิ่มตัวแปรได้ ขอให้สังเกตว่า backticks จะถูกลบออกจากการจัดรูปแบบความคิดเห็น ใช้รูปแบบเดียวกันในคำตอบ tput smul
UNDERLINE

3
tputเป็นคำสั่งที่ยอดเยี่ยมพร้อมคำสั่งมากมายสำหรับงานที่แตกต่างกันมากมาย
Drew Noakes

ฉันกำลังพยายามทำสิ่งที่คล้ายกับสิ่งที่ OP กำลังทำอยู่ แต่ด้วยmotdไฟล์ ฉันจะกำหนด$boldและ$normalตัวแปรในที่ไหน
Matt

74

ในการใช้สไตล์กับสตริงของคุณคุณสามารถใช้คำสั่งเช่น:

echo -e '\033[1mYOUR_STRING\033[0m'

คำอธิบาย:

  • echo -e - -eตัวเลือกหมายความว่าสตริงที่หลบหนี (แบ็กสแลช) จะถูกตีความ
  • \ 033 - ลำดับหลบหนีแสดงถึงจุดเริ่มต้น / สิ้นสุดของสไตล์
  • ตัวพิมพ์เล็ก m - บ่งบอกถึงจุดสิ้นสุดของลำดับ
  • 1 - แอตทริบิวต์ Bold (ดูด้านล่างสำหรับข้อมูลเพิ่มเติม)
  • [0m - รีเซ็ตแอตทริบิวต์, สี, การจัดรูปแบบ ฯลฯ

จำนวนเต็มที่เป็นไปได้คือ:

  • 0 - สไตล์ปกติ
  • 1 - ตัวหนา
  • 2 - ติ่มซำ
  • 3 - ตัวเอียง
  • 4 - ขีดเส้นใต้
  • 5 - กะพริบ
  • 7 - ย้อนกลับ
  • 8 - มองไม่เห็น

1
คำอธิบายที่ดี ถูกมองไปรอบ ๆ สำหรับสิ่งที่ฟังก์ชั่น[0mข้อเสนอและนี้จะอธิบายได้ดี
เจเรมี

แม้ว่ามันควรจะเป็น\033[0m
Jeremy

1
3- ตัวเอียงอย่างน้อยที่สุดใน konsole
David Tabernero M.

หนึ่งความปรารถนา Strikethrough ได้รับการสนับสนุนบน Ubuntu และแพลตฟอร์มยอดนิยมอื่น ๆ
Dark Star1

45

ฉันคิดว่า bash กำลังทำงานบนเทอร์มินัลที่รองรับ vt100 ซึ่งผู้ใช้ไม่ได้ปิดการสนับสนุนสำหรับการจัดรูปแบบอย่างชัดเจน

ขั้นแรกให้เปิดการรองรับอักขระพิเศษechoโดยใช้-eตัวเลือก ต่อมาใช้ลำดับหลบหนีแบบ ansi ESC[1mเช่น:

echo -e "\033[1mSome Text"

เพิ่มเติมเกี่ยวกับลำดับ escape ansi เช่นที่นี่: ascii-table.com/ansi-escape-sequences-vt-100.php


ขอบคุณ ฉันพบรายการหนีลำดับอื่น ๆ แต่รายการที่คุณเชื่อมโยงนั้นกว้างขวางมาก!
JamesRat

18
อย่าลืมที่จะหยุดการจัดรูปแบบตัวหนาที่ส่วนท้ายของสตริง: echo -e "\033[1mSome Text\033[0m"มิฉะนั้นบรรทัดต่อไปนี้ของเทอร์มินัลของคุณก็จะเป็นตัวหนาเช่นกัน
mems

โซลูชันนี้ทำงานได้แม้กับ PHP-CLI ซึ่งเป็นข้อได้เปรียบกับโซลูชันอื่น ๆ
David

หากคุณมีปัญหาในการจำ\033คุณสามารถใช้\eเช่นecho -e "\e[1msome text\e[0m"
เฟลิเป้อัลวาเรซ

1
อนุญาตให้ใช้ลำดับการหลีกหนีใน JS (JavaScript)
Pat-Laugh

14

ในทางทฤษฎีเช่น:

# BOLD
$ echo -e "\033[1mThis is a BOLD line\033[0m"
This is a BOLD line

# Using tput
tput bold 
echo "This" #BOLD
tput sgr0 #Reset text attributes to normal without clear.
echo "This" #NORMAL

# UNDERLINE
$ echo -e "\033[4mThis is a underlined line.\033[0m"
This is a underlined line. 

แต่ในทางปฏิบัติอาจตีความได้ว่าเป็นสี "ความเข้มสูง" แทน

(ที่มา: http://unstableme.blogspot.com/2008/01/ansi-escape-sequences-for-writing-text.html )

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