Komut dosyam neden konsol çıktısında lider boşluk bırakmıyor?


10

Aşağıdaki betiğe sahibim:

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

consoleWriteLine "    indented by 4 spaces"

Çalıştırdığımda aşağıdaki çıktıyı alıyorum:

$ ./test.sh
indented by 4 spaces

4 alanım nereye gitti? Ve onları nasıl geri alabilirim?

Yanıtlar:


22

Sadece alıntı echo fonksiyonunuzda:

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

echo sadece boşlukla ayrılmış çoklu argümanları fark eder ve bunları bir tek alanı. Görmek:

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

Son örnekte dize a b c olduğu bir tek tartışma ve echo olduğu gibi ed.


Burada anlamamın anahtarı, tartışmayı alıntı yapmak, başlangıçta boşluğu yalnızca içine alınana kadar koruyacaktı. consoleWriteLine. İkinci kez echo d, boşlukların ek tırnak işaretleri ile tekrar korunmaları gerekir. Etrafa tırnak koyabileceğinizi asla tahmin edemezdim. $*.
Der Hochstapler

4
Sadece tırnak koyamazsın $*, değişken $@ genişletmek için özel olarak oluşturuldu ayrı kelimeler alıntı yapıldığında: "$@" birkaç argüman olabilir, "$*" her zaman sadece bir tanesidir. echo fark yaratmadığı birkaç komuttan biridir.
alexis

4

Bu sorunu kendim yaşadım,

Başına Bu blog IFS'yi varsayılan olarak beyaz boşluk içerdiği gibi değiştirmeniz gerekir ve bu nedenle "xxx yyy zzzz" ifadesini aralarında boşluk olan 3 karakter olarak görür.

IFS='\n'

komuttan önce bunu düzeltecek ve değişikliği kaldırmak için IFS’in ünitesini

unset IFS


2
bu işe yarıyor, ancak kabul edilen çözüm (alıntı ekleme) çok daha düzenli.
caesarsol

Nod, alıntılanmadığını farketmedim. Tüh! : D
djsmiley2k
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.