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
이것은 나를 혼란스럽게 한다.
echo
각 태그를 별도의 줄에 인쇄하면 어떨까요 ?- 참조 없이
printf
예상대로 작동하는 이유는 무엇입니까?$i
- 인용할 때 왜
echo
및 실패합니까 ?printf
$i
당신의 도움에 감사드립니다
답변1
루프는 for i in "1:2:3"; do ...
한 번만 실행됩니다. 정적 리터럴 문자열에는 토큰화가 없고 확장만 있으며 따옴표 없이 확장만 가능합니다. 다른 결과가 표시됩니다.
IFS=:
var="1:2:3"
for i in $var; do...
나머지는 방법 echo
과 printf
작동입니다. echo
인수를 공백으로 연결하고 연결된 문자열과 개행 문자를 인쇄합니다. 그러나 printf
모든 매개변수를 수용하는 데 필요한 만큼 형식 문자열을 반복하므로 여러 줄 바꿈이 발생합니다.
따라서 첫 번째에서는 echo $i
실행 i
이 1:2:3
. 확장은 따옴표가 없으므로 분할되어 세 개의 매개변수 , , echo
를 얻습니다 . 공백으로 연결하여 출력에 개행 문자가 더해집니다. 달리는 것과 똑같습니다 . (그래도 쉘 명령줄에서 인용되지 않은 공백의 개수는 중요하지 않기 때문입니다.)1
2
3
1 2 3
echo 1 2 3
echo 1 2 "3"
세 번째도 유사하며 printf "%s\n" 1 2 3
형식 문자열을 반복하고 출력이 세 줄로 나누어집니다. 이와 같은 작업은 printf "%s %s\n" 1 2 3
반복될 때마다 두 개의 인수를 사용하고 1 2
한 줄씩 인쇄됩니다 3
.