IFS를 설정할 때 echo와 printf의 출력이 다른 이유는 무엇입니까?

IFS를 설정할 때 echo와 printf의 출력이 다른 이유는 무엇입니까?

Ubuntu 20.04에서 Bash 5.0.17을 사용하고 있습니다.

다음 명령을 실행할 때:

IFS=":"; for i in "1:2:3"; do echo $i; done
# output is: 1 2 3

IFS=":"; for i in "1:2:3"; do echo "$i"; done
output is: 1:2:3

IFS=":"; for i in "1:2:3"; do printf "%s\n" $i; done
# output is: 
# 1
# 2
# 3

IFS=":"; for i in "1:2:3"; do printf "%s\n" "$i"; done
# output is: 1:2:3

이것은 나를 혼란스럽게 한다.

  1. echo각 태그를 별도의 줄에 인쇄하면 어떨까요 ?
  2. 참조 없이 printf예상대로 작동하는 이유는 무엇입니까?$i
  3. 인용할 때 왜 echo및 실패합니까 ?printf$i

당신의 도움에 감사드립니다

답변1

루프는 for i in "1:2:3"; do ...한 번만 실행됩니다. 정적 리터럴 문자열에는 토큰화가 없고 확장만 있으며 따옴표 없이 확장만 가능합니다. 다른 결과가 표시됩니다.

IFS=:
var="1:2:3"
for i in $var; do...

나머지는 방법 echoprintf작동입니다. echo인수를 공백으로 연결하고 연결된 문자열과 개행 문자를 인쇄합니다. 그러나 printf모든 매개변수를 수용하는 데 필요한 만큼 형식 문자열을 반복하므로 여러 줄 바꿈이 발생합니다.

따라서 첫 번째에서는 echo $i실행 i1:2:3. 확장은 따옴표가 없으므로 분할되어 세 개의 매개변수 , , echo를 얻습니다 . 공백으로 연결하여 출력에 개행 문자가 더해집니다. 달리는 것과 똑같습니다 . (그래도 쉘 명령줄에서 인용되지 않은 공백의 개수는 중요하지 않기 때문입니다.)1231 2 3echo 1 2 3echo 1 2 "3"

세 번째도 유사하며 printf "%s\n" 1 2 3형식 문자열을 반복하고 출력이 세 줄로 나누어집니다. 이와 같은 작업은 printf "%s %s\n" 1 2 3반복될 때마다 두 개의 인수를 사용하고 1 2한 줄씩 인쇄됩니다 3.

관련 정보