배열이 있습니다
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[@]}"
매개변수 참조가 포함된 형식 문자열은 모든 매개변수를 사용하는 데 필요한 만큼 반복됩니다. 따라서 단일 참조로 배열의 모든 값을 인쇄하는 데 충분합니다. 여기서 각 값 뒤에는 개행 문자가 옵니다.