왜 스크립트가 콘솔 출력에서 ​​선행 공백을 생략합니까?


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, 공백은 추가 인용 부호로 다시 보존해야합니다. 나는 당신이 주위에 따옴표를 넣을 수 있다고 생각하지 않았을 것 $*입니다.
Der Hochstapler

4
인용 부호를 넣을 수있을뿐만 아니라 $*변형 $@은 인용 할 때 별도의 단어 로 확장되도록 특별히 만들어졌습니다 . "$@"여러 개의 인수가 될 수 있으며 "$*"항상 하나입니다. echo차이가없는 몇 가지 명령 중 하나입니다.
Alexis

4

이 문제가 스스로 있었다면

에 따라 이 블로그는 당신은 공백을 포함 기본적으로 IFS를 변경해야하는 등보고 "XXX YYY ZZZZ"그들 사이의 공백으로 3 개 문자열로.

IFS='\n'

명령이 수정되기 전에 IFS를 설정 해제하여 변경 사항을 제거하십시오.

unset IFS


2
이것은 효과가 있지만 수용 된 솔루션 (따옴표 추가)이 훨씬 더 깔끔합니다.
시저 솔

Nod, 나는 그것이 인용되지 않았다는 것을 눈치 채지 못했습니다. 으악! : D
djsmiley2kStaysInside
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.