เหตุใด“ wc -c” จึงพิมพ์ค่าอีกหนึ่งค่าด้วย echo


13

เมื่อวิ่ง

echo abcd | wc -c

มันกลับ5มา
แต่คำabcdนี้มีความยาวเพียง 4 ตัวอักษร

กำลังechoพิมพ์ตัวละครพิเศษหลังจากคำว่าabcd?

และฉันสามารถป้องกันไม่ให้echoพิมพ์ได้หรือไม่



1
โปรดระวังที่wc -cไม่ได้บอกคุณว่ามีตัวละครอยู่กี่ตัว มันบอกได้ว่ามีกี่ไบท์เท่านั้น
tchrist

คำตอบ:


21

echoพิมพ์ newline ( \n) ที่ท้ายบรรทัด

echo abcd | xxd
0000000: 6162 6364 0a          abcd.

ด้วยechoการใช้งานบางอย่างคุณสามารถใช้-n:

-n อย่าส่งออกบรรทัดใหม่ต่อท้าย

และทดสอบ:

echo -n abcd | wc -c
4

คุณต้องมี\cลำดับการหลบหนี:

\c: ระงับสิ่ง<newline>นั้นตามหลังอาร์กิวเมนต์สุดท้ายในผลลัพธ์ อักขระทั้งหมดที่ตามหลัง'\c'ในอาร์กิวเมนต์จะถูกละเว้น

echo -e 'abcd\c' | wc -c
4

พกพาใช้printf:

printf %s abcd | wc -c
4

(โปรดทราบว่าwc -cนับไบต์ไม่ใช่ตัวอักษร (แม้ว่าในกรณีของabcdพวกเขาจะเทียบเท่าโดยทั่วไป) ใช้wc -mเพื่อนับตัวอักษร)


โปรดทราบว่าประเด็นก็คือว่าด้วยechoการใช้งานบางอย่าง(อย่างน้อยทุกระบบปฏิบัติการที่สอดคล้องกับ Unix อย่างน้อย) มันเป็นecho 'abcd\c'ผลลัพธ์ที่abcdเพียงอย่างเดียว echo -e 'abcd\c'ในระบบปฏิบัติการยูนิกซ์ที่สอดคล้องกับการใช้งานที่จะส่งออกecho -e abcd
Stéphane Chazelas

5

หากคุณเรียกใช้echoโดยไม่มี-nตัวเลือกมันจะเขียนอักขระขึ้นบรรทัดใหม่หลังจากอาร์กิวเมนต์ มิฉะนั้นถ้าคุณพิมพ์แจ้งเปลือกของคุณต่อไปจะปรากฏที่ด้านขวาของecho foo fooดังนั้น  wcกำลังนับบรรทัดใหม่

ฉันจะป้องกันไม่ให้echoพิมพ์ได้อย่างไร

echo -n abcd | wc -c

2

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

คุณสามารถลองเพิ่ม-nพารามิเตอร์echoเพื่อปิดการใช้งานอักขระขึ้นบรรทัดใหม่

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