Bourne 쉘 printf가 %s 인수를 반복하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/42070

  •  09-06-2019
  •  | 
  •  

문제

여기서 무슨 일이 일어나고 있는 걸까요?

printf.sh:

#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" $NAME

명령줄 세션:

$ ./printf.sh
Hello, George
Hello, W.
Hello, Bush

업데이트: printf "Hello, %s\n" "$NAME" 공장.내가 사용하지 않는 이유 echo, 고려하다

에코.sh:

#! /bin/sh
FILE="C:\tmp"
echo "Filename: $FILE"

명령줄:

$ ./echo.sh
Filename: C:    mp

그만큼 POSIX 사양 echo "새로운 애플리케이션을 사용하는 것이 좋습니다. printf 대신에 echo" (이것과 다른 이유로).

도움이 되었습니까?

해결책

NAME 변수는 다음과 같이 대체됩니다.

printf "Hello, %s\n" George W. Bush

이것을 사용하십시오:

#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"

다른 팁

printf를 사용하는 특별한 이유가 있습니까? 아니면 에코 작업도 수행하시겠습니까?

NAME="George W. Bush"
echo "Hello, "$NAME

결과

Hello, George W. Bush

편집하다:"George W.Bush"는 Bourne Shell이 ​​공간으로 구분되어 있기 때문입니다.printf를 계속 사용하려면 $NAME을 큰따옴표로 묶어야 합니다.

printf "Hello, %s\n" "$NAME"

내가 해석하는 방식은 매뉴얼 페이지 전달한 문자열을 인수로 간주합니까?문자열에 공백이 있으면 여러 인수를 전달하는 것으로 간주합니다.저는 ColinYounger가 변수를 따옴표로 묶어서 쉘이 문자열을 단일 인수로 해석하도록 하는 것이 정확하다고 믿습니다.

대안은 printf가 변수를 확장하도록 하는 것입니다:

printf "Hello, $NAME."

링크는 bash용이지만 sh에도 마찬가지라고 확신합니다.

해당 단어를 모두 자체적으로 인쇄하려면 다음을 사용하십시오. 인쇄 대신에 printf

printf 형식 지정 사양을 가져와 전달하는 각 인수에 적용합니다.세 개의 인수 {George, W., Bush}가 있으므로 서로 다른 인수를 사용하여 문자열을 세 번 출력합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top