[bash] Bash에서 여러 줄 문자열을 출력하는 방법은 무엇입니까?

다중 에코 호출을 사용하지 않고 Bash에서 다중 행 문자열을 출력하는 방법은 다음과 같습니다.

echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo
echo "Report bugs to: "
echo "up home page: "

Bash 내장 만 사용 하여이 작업을 수행 할 수있는 휴대용 방법을 찾고 있습니다.



답변

여기서는 종종 이러한 목적으로 문서가 사용됩니다.

cat << EOF
usage: up [--level <n>| -n <levels>][--help][--version]

Report bugs to:
up home page:
EOF

모든 Bash 버전을 포함하여 모든 Bourne 파생 쉘에서 지원됩니다.


답변

또는 당신은 이것을 할 수 있습니다 :

echo "usage: up [--level <n>| -n <levels>][--help][--version]

Report bugs to:
up home page: "


답변

이 페이지의 통찰력있는 답변에서 영감을 얻어 가장 단순하고 유연한 방법을 고려한 혼합 접근법을 만들었습니다. 어떻게 생각해?

먼저 변수에 사용법을 정의하여 다른 컨텍스트에서 재사용 할 수 있습니다. 형식은 제어 문자를 추가 할 필요없이 매우 단순하고 거의 WYSIWYG입니다. 이것은 나에게 합리적으로 휴대용 것 같습니다 (MacOS 및 Ubuntu에서 실행했습니다)

__usage="
Usage: $(basename $0) [OPTIONS]

Options:
  -l, --level <n>              Something something something level
  -n, --nnnnn <levels>         Something something something n
  -h, --help                   Something something something help
  -v, --version                Something something something version
"

그런 다음 간단히 사용할 수 있습니다

echo "$__usage"

또는 매개 변수를 구문 분석 할 때 하나의 라이너로 에코 할 수 있습니다.

levelN=${2:?"--level: n is required!""${__usage}"}


답변

-e옵션을 사용 \n하면 문자열에서 줄 바꿈 문자를 인쇄 할 수 있습니다 .

샘플 (하지만 좋은지 아닌지 확실하지 않음)

재밌는 점은 -e옵션이 여전히 사용 가능하지만 MacOS 매뉴얼 페이지에 설명되어 있지 않다는 것입니다 . 리눅스 매뉴얼 페이지에 설명되어있다 .


답변

printf의견에서 권장 했으므로 사용법에 대한 몇 가지 예를 제시해야합니다 (사용 메시지를 인쇄하더라도 Dennis 또는 Chris의 답변을 사용할 가능성이 큽니다). printf보다 사용하기가 조금 더 복잡합니다 echo. 첫 번째 인수는 형식 문자열이며 이스케이프 (예 🙂 \n항상 해석됩니다. 또한 %추가 인수가 포함되는 위치 및 방법을 제어하는 형식 지시문을 포함 할 수 있습니다 . 사용법 메시지에 사용하는 두 가지 방법이 있습니다.

먼저 전체 메시지를 형식 문자열에 포함시킬 수 있습니다.

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: \nup home page: \n"

와 달리 echo최종 개행 문자를 명시 적으로 포함해야합니다. 또한 메시지에 %문자 가 포함되어 있으면 로 작성해야 %%합니다. 버그 리포트와 홈페이지 주소를 포함하고 싶을 경우, 자연스럽게 추가 할 수 있습니다.

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: %s\nup home page: %s\n" "$bugreport" "$homepage"

둘째, 형식 문자열을 사용하여 각 추가 인수를 별도의 줄에 인쇄 할 수 있습니다.

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: " "up home page: "

이 옵션을 사용하면 버그 리포트 및 홈페이지 주소를 추가하는 것이 매우 분명합니다.

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: $bugreport" "up home page: $homepage"


답변

또한 들여 쓰기 된 소스 코드를 사용하면 <<-(후행 대시와 함께) 선행 탭을 무시할 수 있지만 선행 공백은 무시할 수 있습니다. 예를 들면 다음과 같습니다.

if [ some test ]; then
    cat <<- xx
        line1
        line2
xx
fi

선행 공백없이 들여 쓰기 된 텍스트를 출력합니다.

line1
line2


답변

@jorge의 솔루션을 사용하고 모든 줄이 같은 줄에 있으면 변수를 따옴표로 묶어야합니다.

echo $__usage

한 줄에 모든 것을 인쇄하지만

echo "$__usage"

줄 바꿈을 유지합니다.