bash에서 printf를 사용하여 @로 배열을 인쇄하면 첫 번째 요소만 인쇄되는 이유는 무엇입니까?

bash에서 printf를 사용하여 @로 배열을 인쇄하면 첫 번째 요소만 인쇄되는 이유는 무엇입니까?

배열이 있습니다

snapshots=(1 2 3 4)

내가 달릴 때

printf "${snapshots[*]}\n"

예상대로 인쇄됩니다

1 2 3 4

하지만 내가 달릴 때

printf "${snapshots[@]}\n"

그냥 인쇄된다

1

개행 문자가 없습니다. 내 이해는 배열에 액세스하면 @배열을 확장하여 각 요소가 줄 바꿈에 있도록 해야 하지만 그렇게 하지 않는 것 printf같습니다 echo. 왜 이런거야?

답변1

printf첫 번째 인수를 형식 문자열로 해석하고 이를 인쇄합니다. 다른 인수는 형식 문자열에 필요한 경우에만 사용됩니다.

의 경우 printf "${snapshots[*]}\n"첫 번째 인수는 배열의 요소이며 $IFS첫 번째 문자(기본값은 공백)와 연결되고 그 뒤에 백슬래시와 n: 가 옵니다 "1 2 3 4\n". 배열의 모든 값을 공백으로 구분하고 그 뒤에 개행 문자를 인쇄합니다.

의 경우 printf "${snapshots[@]}\n"첫 번째 인수는 배열의 첫 번째 항목이고 "1"배열의 나머지 부분은 사용할 형식 문자열에 별도의 인수로 제공됩니다. 마지막 매개변수가 \n추가되었습니다: "2" "3" "4\n". 형식 문자열은 다른 매개변수를 참조하지 않으므로 모두 무시됩니다. 모든 출력은 첫 번째 값이며 후속 줄 바꿈이 없습니다.

를 사용할 때 모든 값을 보려면 @실제 형식 문자열을 제공해야 합니다.

printf "%s\n" "${snapshots[@]}"

매개변수 참조가 포함된 형식 문자열은 모든 매개변수를 사용하는 데 필요한 만큼 반복됩니다. 따라서 단일 참조로 배열의 모든 값을 인쇄하는 데 충분합니다. 여기서 각 값 뒤에는 개행 문자가 옵니다.

관련 정보