개행 문자는 따옴표 안에 나타나더라도 손실된 것처럼 보입니다.
foo=
for i in 1 2 3; do
foo="$foo$(printf '\n')$i"
done
echo "$foo"
123
이제 실제로는 \n
첫 번째 요소 앞에 a를 추가하고 싶지 않으므로 대신 a를 사용 ${foo:+$(printf '\n')}
하지만 먼저 위 코드가 작동하지 않는 이유를 파악해야 합니다.
답변1
명령 대체는 후행 개행 문자를 제거하므로 빈 문자열 $(printf '\n')
인 와 동일 합니다.$(printf '\n\n\n\n')
문자열에 개행 문자를 포함하려면 작은따옴표나 큰따옴표 사이에 넣으세요.
for i in 1 2 3; do
foo="$foo
$i"
done
개행 문자를 저장하기 위해 변수를 정의하는 것이 그다지 추악하지 않다는 것을 알 수 있습니다.
nl='
'
for i in 1 2 3; do
foo="$foo$nl$i"
done
ksh93, bash, FreeBSD sh, mksh 및 zsh에서는 아직 일반 sh는 아니지만 백슬래시 이스케이프를 허용하는 달러 작은따옴표를 사용할 수도 있습니다.
for i in 1 2 3; do
foo="$foo"$'\n'"$i"
done
답변2
예, 줄 바꿈이 손실되었습니다.명령 대체 먹다그들을:
쉘은 서브쉘 환경(쉘 실행 환경 참조)에서 명령을 실행하고 명령 대체("$()" 또는 백틱이 포함된 명령 텍스트)를 명령의 표준 출력으로 대체하여 명령 대체를 확장해야 합니다.교체가 끝나면 하나 이상의 <newline> 문자 시퀀스를 제거합니다.
루프가 필요하지 않습니다 for
.
foo=$(printf '%s\n' 1 2 3)