ie IFS
로 설정했습니다 . 이제 값을 확인하면 큰따옴표를 사용하지 않으면 비어 있는 것으로 나타납니다.x
IFS=x
IFS
~ $ 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에서 관련 게시물을 확인하세요.