제가 사용하고 있는 간단한 셸 함수 호출 echo
과 printf
전달한 인수를 인쇄하는 명령이 있습니다. 나는 다음을 발견했습니다.
echo
인쇄 출력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
않아도 개행 문자를 얻으려면 형식 문자열에서 명시적으로 이를 사용해야 합니다 .echo
echo -n
printf
printf()
\n
printf
일반적으로 단어 분리 문제를 방지하려면 이러한 변수와 명령 대체를 인용해야 합니다. 호스트 이름에는 문제가 없을 수 있지만 값에 공백이 있는 경우 필요합니다.
그래서:
check_host() {
echo "$1"
printf "%s\n" "$1"
}
check_host "$(hostname)"
임의의 데이터 인쇄 printf
도 위의 형식 지정자를 통해 수행되어야 합니다 %s
. 그렇지 않으면 %
데이터의 모든 기호가 해석되지 않은 채로 남게 됩니다 printf
.
또한보십시오:왜 printf가 echo보다 나은가요?