Чому мій сценарій опускає провідний пробіл у вихідному консолі?


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, оскільки він за замовчуванням містить пробіл і так бачить "xxx yyy zzzz" як 3 рядки з пробілом між ними.

IFS='\n'

до того, як команда виправить це, і скасує IFS для видалення зміни

unset IFS


2
це працює, але прийняте рішення (додавання лапок) набагато акуратніше.
цезарсол

Кивнувши, я не помітив, що це не цитується. Ого! : D
djsmiley2kStaysInside
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.