소스 코드 내에서 read -p 프롬프트에서 긴 문자열을 여러 줄로 나누는 방법은 무엇입니까?


18

로 실행될 설치 스크립트를 작성 중입니다 /bin/sh.

파일을 요구하는 줄이 있습니다 :

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

이 긴 줄을 여러 줄로 나누어서 80자를 초과하지 않도록하십시오. 스크립트 의 소스 코드 내 줄 에 대해 이야기 하고 있습니다. 스크립트가 실행될 때 화면에 실제로 인쇄 될 줄이 아니라 !

내가 시도한 것 :

  • 가장 어려운 접근 방식 :

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

    잘 작동하지 않습니다. 프롬프트 후에 줄 바꿈을 인쇄합니다. 도움이되지 않는 -n옵션을 추가하면 echo다음과 같이 인쇄됩니다.

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

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

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

/bin/sh호환 가능한 솔루션을 찾고 있음을 기억하십시오 .


1
1. 더 넓은 터미널 및 / 또는 편집기 창을 사용하십시오 (예 : 1440p 모니터에서 192 열 x 51 행 터미널을 사용하십시오-로그 파일을 꼬리에 붙이고 vim에서 소스 코드를 편집하는 데 적합합니다). 사실 소스 코드 행이 80자를 초과 할 수밖에 없습니다. 더 작은 글꼴을 사용하면 터미널이 더 넓어 질 수 있지만 현재 설정은 너비와 가독성의 좋은 절충안입니다.
cas mar

답변:


16

먼저 변수를 사용하여 텍스트 행에서 읽은 내용을 분리하십시오.

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

이런 식으로 문제는 다음과 같습니다. 변수에 두 줄을 할당하는 방법.

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

a="line-1 \
line-2"

이렇게 작성하면 var는 a실제로 값을 가져옵니다 line-1 line-2.

그러나 이것이 들여 쓰기가 부족하다는 것을 좋아하지 않는다면, 여기서 우리는 here-doc에서 var로 줄을 읽으려고 시도 할 수 있습니다 (here-doc 안에 들여 쓰기 된 줄은 공백이 아니라 탭이 필요하다는 것을 명심하십시오. 제대로 작동하려면) :

    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

@BinaryZebra 알고 있습니다. 모든 쉘이 읽은 것은 아니고 -p가있는 모든 쉘이 아니기 때문에 "어떤 쉘이든"을 수정했습니다.
terdon

@terdon 우리 둘 다 동의합니다. 그것이 감사의 이유입니다 :-). 다시 감사합니다.

1

줄 끝의 백 슬래시는 출력의 실제 줄 바꿈이 아니라 여러 줄에 걸쳐 명령을 계속할 수 있도록합니다.

예를 들어 첫 번째 방법은

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

두 줄을 인쇄하고 싶지 않습니다! 스크립트의 소스 코드에서 코드가 한 80 자씩 들어가기를 원합니다 ! 그래도 답변 주셔서 감사합니다 :)
Mateusz Piotrowski

들여 쓰기가 없으므로 제안한 접근 방식이 마음에 들지 않습니다. 내 read함수에 들여 쓰기 되면 접근 방식이 가독성을 엉망으로하는 것처럼 보입니다.
Mateusz Piotrowski

1

변수를 사용하여 @BinaryZebra의 접근 방식 이 더 깨끗 하다는 것을 알았지 만 시도한 방식으로 수행 할 수도 있습니다. 따옴표 안에 줄 바꿈을 유지하면됩니다.

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

줄마다 줄 바꿈을 추가하면 가독성이 향상 될 것이라고 생각하십니까? \n프롬프트 에 삽입하는 방법을 찾지 않았기 때문 입니다. 방금 코드 를 여러 줄로 나누고 모든 줄의 길이는 최대 80 자입니다.
Mateusz Piotrowski 2016 년

1
@MateuszPiotrowski 아, 훨씬 더 이해가됩니다. 그런 다음 내 대답은별로 유용하지 않습니다. 질문을 편집하고 출력이 아닌 코드를 분할하고 싶다는 것을 분명히하십시오. 나는 지금 모바일에 있지만 내일 무언가를 생각 해낼 수 있는지 볼 것이다.
terdon

1
@MateuszPiotrowski 완료, 원래 시도한 작업 버전을 추가했습니다.
terdon

0

이건 어때?

#! / bin / bash
-p "안녕하세요
세계
이것은
여러 줄
프롬프트 : "프롬프트
에코 $ PROMPT


들여 쓰기는 어떻게합니까?
Mateusz Piotrowski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.