이미 대답했듯이 변수를 사용하는보다 이식 가능한 방법은 인용하는 것입니다.
$ printf '%s\t%s\t%s\n' foo bar baz
foo bar baz
$ l="$(printf '%s\t%s\t%s\n' foo bar baz)"
$ <<<$l sed -n l
foo bar baz$
$ <<<"$l" sed -n l
foo\tbar\tbaz$
bash에는 다음과 같은 구현의 차이점이 있습니다.
l="$(printf '%s\t%s\t%s\n' foo bar baz)"; <<<$l sed -n l
이것은 대부분의 쉘의 결과입니다.
/bin/sh : foo bar baz$
/bin/b43sh : foo bar baz$
/bin/bash : foo bar baz$
/bin/b44sh : foo\tbar\tbaz$
/bin/y2sh : foo\tbar\tbaz$
/bin/ksh : foo\tbar\tbaz$
/bin/ksh93 : foo\tbar\tbaz$
/bin/lksh : foo\tbar\tbaz$
/bin/mksh : foo\tbar\tbaz$
/bin/mksh-static: foo\tbar\tbaz$
/usr/bin/ksh : foo\tbar\tbaz$
/bin/zsh : foo\tbar\tbaz$
/bin/zsh4 : foo\tbar\tbaz$
bash는 <<<
인용되지 않은 오른쪽의 변수를 나눕니다 .
그러나
이것은 bash 버전 4.4에서 수정되었습니다. 즉, 값이 $IFS
의 결과에 영향 을 미칩니다 <<<
.
라인으로 :
l=(1 2 3); IFS=:; sed -n l <<<"${l[*]}"
모든 쉘은 IFS의 첫 문자를 사용하여 값을 결합합니다.
/bin/y2sh : 1:2:3$
/bin/sh : 1:2:3$
/bin/b43sh : 1:2:3$
/bin/b44sh : 1:2:3$
/bin/bash : 1:2:3$
/bin/ksh : 1:2:3$
/bin/ksh93 : 1:2:3$
/bin/lksh : 1:2:3$
/bin/mksh : 1:2:3$
/bin/zsh : 1:2:3$
/bin/zsh4 : 1:2:3$
을 사용하면 "${l[@]}"
다른 인수를 구분하기위한 공백이 필요하지만 일부 쉘은 IFS의 값을 사용하도록 선택합니다 (정확합니까?).
/bin/y2sh : 1:2:3$
/bin/sh : 1 2 3$
/bin/b43sh : 1 2 3$
/bin/b44sh : 1 2 3$
/bin/bash : 1 2 3$
/bin/ksh : 1 2 3$
/bin/ksh93 : 1 2 3$
/bin/lksh : 1:2:3$
/bin/mksh : 1:2:3$
/bin/zsh : 1:2:3$
/bin/zsh4 : 1:2:3$
널 IFS를 사용하면 다음 행과 같이 값이 결합되어야합니다.
a=(1 2 3); IFS=''; sed -n l <<<"${a[*]}"
/bin/y2sh : 123$
/bin/sh : 123$
/bin/b43sh : 123$
/bin/b44sh : 123$
/bin/bash : 123$
/bin/ksh : 123$
/bin/ksh93 : 123$
/bin/lksh : 1 2 3$
/bin/mksh : 1 2 3$
/bin/zsh : 123$
/bin/zsh4 : 123$
그러나 lksh와 mksh는 그렇지 않습니다.
인수 목록으로 변경하면 :
l=(1 2 3); IFS=''; sed -n l <<<"${l[@]}"
/bin/y2sh : 123$
/bin/sh : 1 2 3$
/bin/b43sh : 1 2 3$
/bin/b44sh : 1 2 3$
/bin/bash : 1 2 3$
/bin/ksh : 1 2 3$
/bin/ksh93 : 1 2 3$
/bin/lksh : 1 2 3$
/bin/mksh : 1 2 3$
/bin/zsh : 123$
/bin/zsh4 : 123$
yash와 zsh는 인수를 구분하지 않습니다. 버그입니까?
echo -e 'foo\tbar\tbaz\n...'
,echo $'foo\tbar\tbaz\n...'
또는printf 'foo\tbar\tbaz\n...\n'
이들의 또는 변화. 각 탭이나 줄 바꿈을 개별적으로 감싸지 않아도됩니다.