วิธีพิมพ์“ -n” โดยไม่ต้องขึ้นบรรทัดใหม่


16

ฉันพยายามพิมพ์-nโดยใช้echoคำสั่ง แต่ถ้าฉันเพียงพิมพ์echo -nมันจะออกบรรทัดใหม่เท่านั้นไม่แสดงขึ้นมา-nแต่มันจะออกบรรทัดใหม่


ใช้echo -n -- -nงานได้ (ไม่มีกล่อง linux สะดวกในการทดสอบ) หรือไม่?
58

ฉันกำลังติดตั้ง Ubuntu ในเครื่องเสมือนและดูเหมือนจะช้ามากรอ
ระบบปฏิบัติการ Star

1
ฉันได้ตรวจสอบแล้ว - ไม่ได้ อาจเป็นเพราะมันเป็นคำสั่ง bash ภายในและไม่ได้ใช้getopt(???) ในการแยกวิเคราะห์บรรทัดคำสั่ง
n0rd

1
คำถามนี้ถูกถามและตอบคำถามในpubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - "การปรับใช้แอปพลิเคชันที่ ... อาจเป็นไปได้ที่จะสะท้อน -n ควรใช้โปรแกรมอรรถประโยชน์ printf ที่ได้มาจาก Ninth ระบบการพิมพ์ "
Brandin

คำถามยอดนิยมอันดับแรกที่ฉันทำ เย้?
ระบบปฏิบัติการ Star

คำตอบ:


28

ปัญหาคือechoการตีความ-nว่าเป็นข้อโต้แย้ง ในการใช้งานทุบตีเริ่มต้นนั่นหมายถึง (จากhelp echo):

  -n  do not append a newline

มีหลายวิธีในการแก้ไข:

  1. ทำให้เป็นสิ่งที่ไม่มีตัวเลือกโดยรวมอักขระอื่น ตัวอย่างเช่นechoอย่าบอกให้พิมพ์บรรทัดใหม่ด้วย-nแล้วบอกให้ตีความเครื่องหมายทับขวาด้วย-eและเพิ่มบรรทัดใหม่อย่างชัดเจน

    $ echo -ne '-n\n'
    -n
  2. หรือเพียงแค่รวมช่องว่าง

    $ echo " -n"
     -n

    อย่างไรก็ตามนั้นเพิ่มพื้นที่ซึ่งคุณอาจไม่ต้องการ

  3. ใช้อักขระที่ไม่ได้พิมพ์ก่อนหน้า ที่นี่ ฉันใช้แบ็คสเปซ ( \b)

    $ echo -e "\b-n"
    -n

    นอกจากนี้ยังเพิ่มอักขระพิเศษที่คุณอาจไม่ต้องการ

  4. ใช้เล่ห์เหลี่ยม

    $ echo n- | rev
    -n

    revคำสั่งก็จะพิมพ์ผลลัพธ์ที่ได้ตรงกันข้าม

  5. ใช้เครื่องมือที่เหมาะสมสำหรับงาน

    $ printf -- '-n\n'
    -n

คุณถูกต้องว่า `` `อักขระที่ถูกต้องจะทำ
Pilot6

@ Pilot6 ใช่ แต่ปัญหาเกี่ยวกับวิธีการนั้น (ของคุณและของฉัน) คือมันเพิ่มตัวละครพิเศษ ที่อาจทำให้เกิดปัญหาตามมาได้ grep '^-n'โดยเฉพาะอย่างยิ่งถ้าคุณต้องการที่จะแยกมันและพยายามบางอย่างเช่น pritnfเป็นวิธีที่จะไปจริงๆ
terdon

ดีprintfจะดีกว่าอยู่แล้ว echoแต่คำถามที่เกี่ยวกับการเป็นเพียงแค่
Pilot6

2
ดูเหมือนว่าecho -e "-n\c"จะทำสิ่งที่แน่นอน
Pilot6

1
\cถูกระงับเอาต์พุตเพิ่มเติม
Pilot6

15

บางครั้งควรใช้เครื่องมือที่เหมาะสม คุณสามารถใช้printfแทน:

% printf "-n\n"       
-n

1
นี้เป็นความคิดที่ดีเนื่องจากมีหลายสายพันธุ์echoในขณะที่printfเป็นมาตรฐานที่ดีขึ้น
200_success

นี่เป็นแนวคิดที่แนะนำสำหรับการพกพา
Sergiy Kolodyazhnyy

7

คุณสามารถใช้คำสั่งนี้ แต่มันเพิ่มพื้นที่พิเศษ

echo -e  "\r-n"

นี่เป็นแฮ็คชนิดหนึ่ง

-e เปิดใช้งานสัญลักษณ์คำสั่งแบ็กสแลช

\r คือการคืนสินค้า

จริง ๆ แล้ว\อักขระที่ถูกต้องจะทำในสถานที่ใด ๆ ของสตริง

help echoคุณสามารถดูว่าถูกต้องโดย

echo "-n"ไม่ได้เพราะการทำงานจะใช้เป็นพารามิเตอร์สำหรับ-necho

ป.ล.ทางออกที่ดีที่สุดคือ IMHO

echo -e "-n\c"

มันไม่ได้เพิ่มตัวละครพิเศษใด

echo -e "-n\n"

พิมพ์เหมือนกัน แต่ด้วยอักขระบรรทัดใหม่


1
wov! มันดีกว่าของฉัน คุณช่วยอธิบายหน่อยได้ไหมสำหรับ "ผู้เริ่มต้น" ;-)
Sadi

ขอบคุณฉันยังสังเกตเห็นว่าไม่สำคัญว่าคุณจะเพิ่มการรับคืนของรถที่จุดเริ่มต้นหรือจุดสิ้นสุด
Sadi

@Sadi ใช่นั่นเป็นเพราะการเพิ่มอะไรก็ตามทำให้มันเป็นตัวเลือกที่ไม่ถูกต้อง -nถูกต้อง-nfooไม่ใช่เพื่อที่จะพิมพ์
terdon

@terdon man echoก็มีเหมือนกัน แต่helpดีกว่านิดหน่อย
Pilot6

ฉันรู้ว่ามันมีมันก็ไม่เกี่ยวข้อง /bin/echoเป็นสิ่งที่แตกต่างอย่างสิ้นเชิงและเมื่อคุณทำงานechoในทุบตีคุณจะได้รับ builtin ซึ่งอาจแตกต่างกันมากขึ้นอยู่กับเปลือกของคุณ
terdon

5

ฉันคิดว่าถ้าคุณต้องการใช้อย่างแน่นอนechoเท่านั้นสิ่งนี้จะทำให้คุณพึงพอใจ:

echo "-n "

งานนี้เพราะในขณะที่ยัง-nเป็นตัวเลือกที่ถูกต้องสำหรับecho, -nมีพื้นที่หลังจากที่มันไม่ได้เป็น เนื่องจากไม่ใช่ตัวเลือกให้echoพิมพ์ออกมา


ผู้ชมส่วนใหญ่ที่นี่อาจต้องการแค่ "-n" ไม่ใช่ "-n"
ระบบปฏิบัติการ Star

5

พวกคุณคิดมากจริง ๆ

 echo -e \\055n

หรือไม่ขึ้นบรรทัดใหม่

 echo -en \\055n

การprintf "-n\n" คิดมากเป็นอย่างไร
Dmitry Grigoryev

ใช่ฉันเพิ่งตอบแบบนี้ จะลบคำตอบของฉัน นี้ค่อนข้างพกพาในที่ทำงานกับ echo ในตัวและ/bin/echoอย่างน้อยถ้าเรียกว่าเป็นecho -e "\055n"
abligh

- ไม่ใช่สิ่งที่ฉันต้องการ
ระบบปฏิบัติการระดับ

2

ที่จะขยาย @ คำตอบ AB เป็นวิธีเดียวที่พกพาไปใช้งานechoคือการละเว้นจากการใช้ตัวเลือกใด ๆ -nเช่น พิจารณาใช้printfแทนหากมี หน้าอ้างอิงนี้ให้รายละเอียดเพิ่มเติมและอธิบายได้เป็นอย่างดีเมื่อใดและอย่างไรechoและprintfควรจะใช้:

ทุกวันนี้ echo (1) สามารถพกพาได้ก็ต่อเมื่อคุณไม่ใช้ค่าสถานะและลำดับการยกเว้น ใช้ printf (1) แทนหากคุณต้องการมากกว่าข้อความธรรมดา


ฉันจะขยายคำตอบโปรดแก้ไขคำตอบ
Star OS

ฉันไม่แน่ใจว่ามันเป็นความคิดที่ดีที่จะเปลี่ยนคำตอบของคนอื่นไปยังจุดที่เมื่อมันจะมีข้อความเพิ่มเติมจากฉันกว่าจากผู้เขียนต้นฉบับ
Dmitry Grigoryev

2

ใน Bash script คุณสามารถเรียกใช้:

echo -n -
echo n

หรือในเปลือก interacive:

echo -n - ; echo n

นี่echoคือ-ตัวละครและnตัวละคร


คุณลองหรือยัง มันผิด.
Pilot6


-pilot6@Pilot6:~$ผลคำสั่งแรก nเอาท์พุทที่สอง
Pilot6

@ Pilot6 ขึ้นอยู่กับว่าคุณกำลังใช้งานในเทอร์มินัลเชิงโต้ตอบหรือในสคริปต์ทุบตีซึ่งไม่ได้ระบุไว้ในคำถาม OTOH ถ้าคุณต้องการมันในขั้วมันเป็นเรื่องง่ายที่จะเพียงแค่รวมทั้งสองเส้นที่มี&&- ฉันจะไม่พูดคำตอบนี้เป็นที่ไม่ถูกต้อง
user12205

ฉันจะแก้ไขมันเพื่อให้ชัดเจนมากขึ้นสำหรับสคริปต์ทุบตี
ระบบปฏิบัติการ Star

1

อีกสามวิธี:

$ echo -e '\x2dn' # ASCII hexadecimal value
-n
$ echo -e '\u002dn' # Unicode code point
-n
$ echo -e '\u2dn' # Unicode code point shortened
-n

0

คุณสามารถเรียกใช้

printf -n;echo

ผ่านการทดสอบใน Busybox Ash


เถ้า? เถ้า? POKEMON ฉันหมายถึงอะไร
Star OS

ฉันวิ่ง 'busybox ash'
jiwopene

พูดว่า "Busybox" หรือ "Busybox Ash" ไม่เพียง แต่เป็นคนขี้อาย "แอช" เท่านั้นที่อาจนึกถึงตัวละครโปเกมอนหรือแอช ******* จากภูเขาไฟ
ระบบปฏิบัติการ Star

ดีกว่า alt255alt255
ระบบปฏิบัติการดาว

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