2017-04-16 3 views
1

pwd_ids라는 배열에 일부 값이 있습니다. printf로 모든 값을 인쇄하려고 할 때 첫 번째 요소 만 제공하고 에코로 인쇄하면 모든 요소를 ​​제공합니다. 그 이유는 무엇입니까? 아래 예를 보자.

set -A pwd_ids E.1.1.7 E.1.1.9 E.1.1.2 E.1.1.3 E.1.1.4 E.1.1.6 E.1.1.5 
echo "${pwd_ids[@]}" 
printf "${pwd_ids[@]}\n" 

출력 : printf

E.1.1.7 E.1.1.9 E.1.1.2 E.1.1.3 E.1.1.4 E.1.1.6 E.1.1.5 
E.1.1.7 
+0

bash is not ksh – Cyrus

+0

Cyrus가 말했듯이 bash 태그는 ksh에서만 유효한 코드가있는 질문에는 사용하지 말아야합니다. –

+0

Cyrus와 Charles에게 감사의 말을 전한다. 실수로 bash를 받았다. –

답변

4

첫 번째 인수는 형식 문자열입니다. 데이터는 후속 인수로 전달되어야합니다. 따라서 :

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

제대로 발광 것이다

E.1.1.7 
E.1.1.9 
E.1.1.2 
E.1.1.3 
E.1.1.4 
E.1.1.6 
E.1.1.5 

다른 형식 문자열이 또한 사용될 수있다; 예를 들어 앞에 대쉬로 항목을 인쇄하려면 다음을 사용할 수 있습니다. printf ' - %s\n' "${pwd_ids[@]}";

printf '%s\n' "${pwd_ids[*]}" 

: 또는 단일 이후의 인수에 그들 모두를 통과, 모두 한 줄에 값을 넣어, 20 대에게 패딩 열에서 선에 printf '%20s%20s\n' "${pwd_ids[@]}"


를 두를 인쇄하거나 출력으로 (당신의 IFS 변수는 달리 기본에 경우, 또는 공백으로 시작) :

E.1.1.7 E.1.1.9 E.1.1.2 E.1.1.3 E.1.1.4 E.1.1.6 E.1.1.5 

위의 내용을 모두 설명하려면 다음과 같은 인수가 형식 문자열의 자리 표시 자로 대체됩니다. 위의 첫 번째 경우 배열의 각 요소는 %s\n에 대해 평가되므로 줄 바로 뒤에 줄 바꿈이 추가됩니다.

질문에 대해서는 E.1.1.7을 형식 문자열로 전달합니다. 이 형식 문자열은 자리 표시자를 전혀 가지지 않으므로 셸에서 수행하는 작업은 정의되지 않습니다. ksh 버전에서는 형식 문자열 만 출력하고 후속 인수는 무시합니다. 다른 셸에서는 인수 당 한 번 형식 문자열 (E1.1.7)을 인쇄하고 해당 인수 값은 무시할 수 있습니다.