Mengapa skrip saya menghilangkan spasi kosong di output konsol?

10

Saya memiliki skrip berikut:

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

consoleWriteLine "    indented by 4 spaces"

Ketika saya menjalankannya, saya mendapatkan output berikut:

$ ./test.sh
indented by 4 spaces

Ke mana 4 spasi saya pergi? Dan bagaimana saya mendapatkannya kembali?

Der Hochstapler
sumber

Jawaban:

22

Cukup kutip echodalam fungsi Anda:

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

echohanya memperhatikan beberapa argumen yang dipisahkan oleh spasi dan mencetaknya dipisahkan oleh satu ruang. Lihat:

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

Dalam contoh terakhir string a b cadalah satu argumen tunggal dan echoed apa adanya.

kekacauan
sumber
Kuncinya bagi saya untuk mengerti di sini adalah, mengutip argumen pada awalnya hanya akan mempertahankan spasi putih sampai disahkan consoleWriteLine. Kali kedua adalah echo'd, spasi putih perlu dipertahankan lagi dengan kutipan tambahan. Saya tidak akan pernah menduga bahwa Anda dapat menempatkan tanda kutip di sekitar $*.
Der Hochstapler
4
Anda tidak hanya dapat menaruh tanda kutip $*, varian $@ini secara khusus dibuat untuk berkembang menjadi kata-kata yang terpisah ketika dikutip: "$@"dapat berupa beberapa argumen, "$*"selalu hanya satu. echoadalah salah satu dari sedikit perintah yang tidak ada bedanya.
alexis
4

Punya masalah ini sendiri,

Per blog ini Anda perlu mengubah IFS karena secara default berisi ruang putih dan melihat "xxx yyy zzzz" sebagai 3 string dengan ruang putih di antara mereka.

IFS='\n'

sebelum perintah akan memperbaikinya, dan unset IFS untuk menghapus perubahan

unset IFS

djsmiley2kStaysInside
sumber
2
ini bekerja, tetapi solusi yang diterima (menambahkan tanda kutip) jauh lebih rapi.
caesarsol
Tidak, saya tidak melihat itu tidak dikutip. Aduh! : D
djsmiley2kStaysInside