"echo $IFS"는 IFS 값을 반환하지 않습니다.

"echo $IFS"는 IFS 값을 반환하지 않습니다.

ie IFS로 설정했습니다 . 이제 값을 확인하면 큰따옴표를 사용하지 않으면 비어 있는 것으로 나타납니다.xIFS=xIFS

~ $ echo $IFS | cat -e
$
~ $ echo "$IFS" | cat -e
x$
~ $ echo $HOME   
/home/mar
~ $ echo "$HOME"
/home/mar
~ $ 

위에서 본 것처럼 $HOME동작은 이와 같지 않습니다. 이 행동의 이유는 무엇입니까?

답변1

변수가 확장된 후 단어 분할이 발생하여 빈 단어로 분할됩니다. 분할은 변수의 각 문자를 구분 기호로 사용하여 IFS수행 되며, $IFS의 문자로만 확장되므로 IFS빈 단어로 분할됩니다.

예를 들면 다음과 같습니다.

IFS=xxx;
printf %q $IFS
''''''[root@localhost ~]#

큰따옴표를 사용하면 bash에게 따옴표 안의 모든 내용을 한 단어로 처리하도록 지시하는 것입니다.

printf %q "$IFS"
xxx[root@localhost ~]#

답변2

이 내용이 에 언급된 내용과 관련이 있는 것 같습니다.고급 Bash 스크립팅 가이드

단어 분리를 방지하려면 큰따옴표를 사용하세요. [2] 큰따옴표로 묶인 인수는 공백 구분 기호가 포함되어 있더라도 그 자체를 단일 단어로 렌더링합니다.

예제 (5.1)과 결합하면 다음과 같습니다.

var="'(]\\{}\$\""
echo $var        # '(]\{}$"
echo "$var"      # '(]\{}$"     Doesn't make a difference.

IFS='\'
echo $var        # '(] {}$"     \ converted to space. Why?
echo "$var"      # '(]\{}$"

답변3

여기서 단어 분할 문제를 해결하는 또 다른 방법은 다음과 같습니다.

set | grep -w IFS=

출력 기본 IFS는 다음과 같습니다.

IFS=$' \t\n'

Stack Overflow에서 관련 게시물을 확인하세요.

관련 정보