'echo' โดยไม่ขึ้นบรรทัดใหม่ในเชลล์สคริปต์


540

ฉันมีปัญหากับechoในสคริปต์ของฉัน:

echo -n "Some string..."

พิมพ์

-n Some string...

และย้ายไปยังบรรทัดถัดไป ในคอนโซลมันทำงานได้อย่างถูกต้องโดยไม่ต้องขึ้นบรรทัดใหม่:

Some string...

2
คุณกำลังใช้การใช้เชลล์เบิร์นแบบไหน? ถ้าฉันทำงานbashในโหมด bourne shell มันจะทำงานได้ดีที่นี่ นอกจากนี้ยังเป็นไปได้ยากที่คุณจะใช้เปลือก bourne เป็นเชลล์เชิงโต้ตอบของคุณใช่ไหม
FatalError

4
บน Ubuntu:echo -ne "text without new line: "; echo "some text";
zsoltii

ฉันรู้ว่านี่เก่ามาก แต่ใช้งานได้กับฉันใน Windows 10 เพื่อเพิ่มช่วงเวลาโดยไม่ต้องขึ้นบรรทัดใหม่: echo | set / p = "."
SPlatten

คำตอบ:


572

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

printfคำสั่งมีพฤติกรรมมากสอดคล้องกันมากขึ้น echoไม่เป็นไรสำหรับสิ่งที่เรียบง่ายเช่นecho helloแต่ฉันแนะนำให้ใช้printfกับสิ่งที่ซับซ้อนกว่านี้

คุณใช้ระบบอะไรและสคริปต์ของคุณใช้เชลล์อะไร?


46
โดยเริ่มจากบรรทัด#!/bin/bashมันใช้งานได้ โดยปกติฉันทำงานกับทุบตี
qwertz

ฉันหวังว่าจะมี Windows เทียบเท่าใน CMD :( เท่าที่ฉันเห็นมีเพียงการแก้ไขปัญหาเพื่อให้ได้พฤติกรรมเดียวกัน
kayleeFrye_onDeck

2
@kayleeFrye_onDeck: อาจมีprintfคำสั่งเวอร์ชัน Windows
Keith Thompson

ฉันหวังว่า. echoเพิ่มบรรทัดใหม่เสมอ ... วิธีแก้ปัญหาคือสิ่งที่ดีที่สุด
kayleeFrye_onDeck

2
@alper %เป็นเชลล์พรอมต์ของคุณ ลองใช้ดูอย่างระมัดระวัง:printf hello; sleep 5
Keith Thompson

150

bash มีคำสั่ง "built-in" ชื่อ "echo":

$ type echo
echo is a shell builtin

นอกจากนี้ยังมีคำสั่ง "echo" ที่สามารถเรียกใช้งานได้อย่างเหมาะสม (นั่นคือเชลล์ forks และ execs /bin/echoซึ่งต่างจากการตีความechoและการเรียกใช้งาน):

$ ls -l /bin/echo
-rwxr-xr-x 1 root root 22856 Jul 21  2011 /bin/echo

พฤติกรรมของechoWRT อย่างใดอย่างหนึ่ง\cและ-nแตกต่างกันไป ทางออกที่ดีที่สุดของคุณคือใช้printfซึ่งมีให้ในสี่รสชาติที่แตกต่างกันที่ฉันดู:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"

3
ขอบคุณสำหรับคำตอบเชิงลึกอย่างหนาแน่น!
Darth Egregious

91

ลองด้วย

echo -e "Some string...\c"

ใช้งานได้ตามที่คาดหวัง (ตามที่ฉันเข้าใจจากคำถามของคุณ)

โปรดทราบว่าฉันได้รับข้อมูลนี้จากmanหน้า manหน้ายังตั้งข้อสังเกตเปลือกอาจจะมีรุ่นของตัวเองechoและผมไม่แน่ใจว่าถ้าbashมีรุ่นของตัวเอง


+1 สำหรับการแนะนำฉันไปในทิศทางที่ถูกต้องแม้ว่าเสียงสะท้อนที่ไม่รู้จักตัวเลือก -ne อาจไม่รู้จักตัวเลือก -e (หรือต้องการ) ดังนั้นคุณอาจต้องการพูดecho "some string...\c"แทน หากคุณต้องการสนับสนุนตัวแปร bash หลายตัวด้วยคำสั่ง echo ที่แตกต่างกันคุณอาจใช้ printf ได้ดีกว่าหรือคุณต้องตรวจสอบความสามารถของคำสั่ง echo ด้วยสิ่งต่าง ๆ[ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(อย่างน้อย bash รองรับ \ c เช่นกันดังนั้นจึงไม่จำเป็นต้องใช้ ตัวเลือก -n แต่คุณต้องใช้ -e สำหรับทุบตี)
Timo

สำหรับฉันมันทำสิ่งที่ -n ทำในกรณีของ OP: เอาท์พุทตัวอักษร -e ฉันเดา printf สอดคล้องกันมากขึ้นแน่นอน
aexl

-e จะไม่ทำงานในสคริปต์เชลล์ posix มันจะถูกส่งออกไปยังหน้าจอแทน
โทมัส Dignan

7

เพื่อให้บรรลุนี้มีสองวิธีที่ฉันใช้บ่อย:

1.การใช้อักขระยกเว้นเคอร์เซอร์ ( \c) ด้วยecho -e

ตัวอย่าง :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eflag เปิดใช้งานอักขระ Scape Eในสตริง
  • \cนำC ursor กลับไปบรรทัดปัจจุบัน

หรือ

2.การใช้printfคำสั่ง

ตัวอย่าง :

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4

3

หากคุณใช้ echo ภายในคำสั่ง if พร้อมคำสั่งอื่นเช่น "read" คำสั่งนี้อาจไม่สนใจการตั้งค่าและจะข้ามไปยังบรรทัดใหม่อย่างไรก็ตาม


2

สำหรับลินุกซ์ที่นิยมมากที่สุด Ubuntu & คือbash:

  1. ตรวจสอบว่าคุณใช้เปลือกไหน งานด้านล่างเป็นส่วนใหญ่มิฉะนั้นจะเห็นสิ่งนี้ :

    echo $0

  2. หากพิมพ์ด้านบนbashแล้วด้านล่างจะทำงาน:

    printf "hello with no new line printed at end"
    หรือ
    echo -n "hello with no new line printed at end"


1

ฉันเชื่อว่าตอนนี้งานพิมพ์ของคุณเป็นดังนี้

~ echo -e "String1\nString2"
String1
String2

คุณสามารถใช้xargsเพื่อรับหลายบรรทัดในบรรทัดเดียวกัน

 ~ echo -e "String1\nString2" | xargs
String1 String2

 ~

0

เมื่อคุณไปและเขียนเชลล์สคริปต์ให้คุณใส่บรรทัดแรกเป็น #! / usr / bin / env bash เปลือกนี้ไม่ละเว้นหรือจัดการกับลำดับการหลีก ex echo "นี่คือบรรทัดแรก \ n" การพิมพ์นี่คือบรรทัดแรก \ n


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