ทำไมสคริปต์ของฉันไม่นำหน้าช่องว่างในคอนโซลเอาต์พุต


10

ฉันมีสคริปต์ต่อไปนี้:

#!/bin/bash
function consoleWriteLine() {
  echo $* >&2
}

consoleWriteLine "    indented by 4 spaces"

เมื่อฉันรันมันฉันจะได้ผลลัพธ์ต่อไปนี้:

$ ./test.sh
indented by 4 spaces

ช่องว่าง 4 ช่องของฉันไปไหน และฉันจะนำพวกเขากลับมาได้อย่างไร

คำตอบ:


22

เพียงแค่พูดechoในฟังก์ชั่นของคุณ:

function consoleWriteLine() {
  echo "$*" >&2
}

echoเพียงสังเกตเห็นอาร์กิวเมนต์หลายตัวคั่นด้วยช่องว่างและพิมพ์โดยคั่นด้วยช่องว่างเดียว ดู:

$ echo a b c
a b c
$ echo a b             c
a b c
$ echo "a b             c"
a b             c

ในตัวอย่างสุดท้ายสตริงa b cเป็นหนึ่งอาร์กิวเมนต์เดียวและechoเอ็ดมันเป็น


consoleWriteLineที่สำคัญสำหรับผมที่จะเข้าใจนี่คือข้อความอาร์กิวเมนต์แรกจะเก็บไว้เพียงช่องว่างจนกว่าจะมีการผ่านเข้าสู่ ครั้งที่สองมันคือecho'd, ช่องว่างจำเป็นต้องได้รับการรักษาอีกครั้งโดยคำพูดเพิ่มเติม ฉันไม่เคยคาดเดาได้เลยว่าคุณจะสามารถพูด$*ได้
Der Hochstapler

4
ไม่เพียง แต่คุณสามารถใส่เครื่องหมายคำพูดล้อมรอบ$*ตัวแปรต่างๆ$@นั้นถูกสร้างขึ้นโดยเฉพาะเพื่อขยายออกเป็นคำที่แยกออกมาเมื่อมีการอ้างถึง: "$@"อาจเป็นอาร์กิวเมนต์หลาย"$*"ตัว echoเป็นหนึ่งในไม่กี่คำสั่งที่ทำให้ไม่มีความแตกต่าง
alexis

4

หากมีปัญหานี้ด้วยตนเอง

ตามบล็อกนี้คุณจำเป็นต้องเปลี่ยน IFS ตามค่าเริ่มต้นมันมี white space และดังนั้นจึงเห็น "xxx yyy zzzz" เป็น 3 สายอักขระที่มีช่องว่างระหว่างพวกเขา

IFS='\n'

ก่อนที่คำสั่งจะแก้ไขและยกเลิกการตั้งค่า IFS เพื่อลบการเปลี่ยนแปลง

unset IFS


2
สิ่งนี้ใช้งานได้ แต่โซลูชันที่ได้รับการยอมรับ
caesarsol

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