올바른 솔루션.

올바른 솔루션.

./bin/sh

입력 파일을 묻는 줄이 있습니다:

read -p "goat may try to change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY

이 긴 줄을 여러 줄로 나누어 각 줄이 80자를 넘지 않도록 하고 싶습니다. 내가 말한 건소스 코드의 한 줄스크립팅됨;아니요스크립트 실행시 실제로 화면에 출력되는 라인에 대해서!

내가 시도한 것:

  • 첫 번째 방법:

    read -p "oat may try to change directory if cd fails to do so. " \
        "Would you like to add this feature? [Y|n] " REPLY
    

    인쇄되지 않기 때문에 작동하지 않습니다 Would you like to add this feature? [Y|n].

  • 두 번째 방법:

    echo "oat may try to change directory if cd fails to do so. " \
        "Would you like to add this feature? [Y|n] "
    read REPLY
    

    효과도 별로 좋지 않습니다. 프롬프트 뒤에 개행 문자를 인쇄합니다. -n옵션을 추가해도 echo도움이 되지 않습니다. 단지 다음 내용만 인쇄됩니다.

    -n goat oat may try to change directory if cd fails to do so. Would you like to add this feature? [Y|n]
    # empty line here
    
  • 내 현재 해결 방법은

    printf '%s %s ' \
        "oat may try to change directory if cd fails to do so." \
        "Would you like to add this feature? [Y|n] "
    read REPLY
    

더 좋은 방법이 있는지 궁금합니다.

/bin/sh제가 호환 가능한 솔루션을 찾고 있다는 점을 명심하시기 바랍니다 .

답변1

먼저 변수를 사용하여 텍스트 줄에서 읽기를 분리해 보겠습니다.

text="line-1 line-2"             ### Just an example.
read -p "$text" REPLY

그러면 질문은 변수에 두 행을 할당하는 방법이 됩니다.

물론 이를 수행하기 위한 첫 번째 시도는 다음과 같습니다.

a="line-1 \
line-2"

이런 식으로 작성하면 var는 a실제로 값을 얻습니다 line-1 line-2.

하지만 이로 인해 발생하는 들여쓰기 부족이 마음에 들지 않으면 여기 문서에서 줄을 var로 읽어 볼 수 있습니다(여기 문서에서 들여쓰기된 줄이 제대로 작동하려면 공백이 아닌 탭이 필요하다는 점에 유의하세요).

    a="$(cat <<-_set_a_variable_
        line-1
        line-2
        _set_a_variable_
    )"
echo "test1 <$a>"

그러나 실제로는 두 개의 행이 작성되었기 때문에 실패합니다 $a. 하나의 행만 가져오는 해결 방법은 다음과 같습니다.

    a="$( echo $(cat <<-_set_a_variable_
        line 1
        line 2
        _set_a_variable_
        ) )"
echo "test2 <$a>"

이것은 가깝지만 다른 추가적인 문제를 야기합니다.

올바른 솔루션.

위의 모든 시도는 문제를 더욱 복잡하게 만들 뿐입니다.

매우 기본적이고 간단한 방법은 다음과 같습니다.

a="line-1"
a="$a line-2"
read -p "$a" REPLY

특정 예제의 코드는 ( read지원되는 모든 쉘 에 대해 -p) 다음과 같습니다.

#!/bin/dash
    a="goat can try change directory if cd fails to do so."
    a="$a Would you like to add this feature? [Y|n] "
# absolute freedom to indent as you see fit.
        read -p "$a" REPLY

다른 모든 쉘의 경우 다음을 사용하십시오.

#!/bin/dash
    a="goat can try change directory if cd fails to do so."
    a="$a Would you like to add this feature? [Y|n] "
# absolute freedom to indent as you see fit.
        printf '%s' "$a"; read REPLY

답변2

내가 찾은@BinaryZebra의 방법변수를 사용하는 것이 더 깔끔하지만 원하는 방식대로 사용할 수도 있습니다. 개행 문자를 따옴표로 묶을 수 있습니다.

read -p "goat can try change directory if cd fails to do so. \
Would you like to add this feature? [Y|n] " REPLY

답변3

줄 끝의 백슬래시를 사용하면 출력에서 ​​실제 개행이 아닌 여러 줄에서 명령을 계속할 수 있습니다.

예를 들어 첫 번째 방법은 명령이 됩니다.

read -p "goat can try change directory if cd fails to do so. " "Would you like to add this feature? [Y|n] " REPLY

왜 여러 줄의 출력을 읽고 싶은지 잘 모르겠지만 read프롬프트 줄과 echo이전 줄에 대해서만 읽고 싶습니다.

여러 줄로 구성된 코드를 더 읽기 쉽게 만들려면 줄 사이에 따옴표를 닫거나 열지 마세요.

이 시도:

read -p "goat can try change directory if cd fails to do so. \
Would you like to add this feature? [Y|n] " REPLY

답변4

이건 어때:

#!/bin/bash
읽기 -p "안녕하세요
세계
이것은
여러 줄
팁: "팁
에코$힌트

관련 정보