Bash 함수 호출에서 "echo" 및 "printf" 사용

Bash 함수 호출에서 "echo" 및 "printf" 사용

제가 사용하고 있는 간단한 셸 함수 호출 echoprintf전달한 인수를 인쇄하는 명령이 있습니다. 나는 다음을 발견했습니다.

  1. echo인쇄 출력
  2. printf인쇄물 없음

여기서 뭔가 빠졌나요?

check_host(){
    # prints output
    echo $1

    # does not print the output
    printf $1

    }
check_host $(hostname)

답변1

표시되는 함수는 첫 번째 인수를 두 번 인쇄합니다. 한 번은 개행 문자를 추가하고 한 번은 인쇄합니다.개행 문자 없음두 번째 출력이 끝나면.

예를 들어, 대화형 Bash 셸에서는 다음과 같은 결과를 얻을 수 있습니다.

user@foo /tmp$ check_host foo
foo
foouser@foo /tmp$ 

출력은 다음에서 비롯됩니다.printf 거기, 같은 줄에 있지 않습니다.

echo와 의 차이점은 요청하지 이를 방지할 수 있습니다사용하여(printf않아도 개행 문자를 얻으려면 형식 문자열에서 명시적으로 이를 사용해야 합니다 .echoecho -nprintfprintf()\nprintf

일반적으로 단어 분리 문제를 방지하려면 이러한 변수와 명령 대체를 인용해야 합니다. 호스트 이름에는 문제가 없을 수 있지만 값에 공백이 있는 경우 필요합니다.

그래서:

check_host() {
    echo "$1"
    printf "%s\n" "$1"
}
check_host "$(hostname)"

임의의 데이터 인쇄 printf도 위의 형식 지정자를 통해 수행되어야 합니다 %s. 그렇지 않으면 %데이터의 모든 기호가 해석되지 않은 채로 남게 됩니다 printf.

또한보십시오:왜 printf가 echo보다 나은가요?

관련 정보