들여쓰기를 사용하여 여러 줄 변수에 문자열 값을 할당하는 방법은 무엇입니까?

들여쓰기를 사용하여 여러 줄 변수에 문자열 값을 할당하는 방법은 무엇입니까?

질문:

  1. 변수에 상당히 긴 값을 할당해야 합니다.
  2. 내 스크립트의 모든 행은 특정 수의 열 아래에 있어야 합니다.

그래서 여러 행을 사용해 배포해 보았습니다.

들여쓰기가 없으면 간단합니다.

VAR="This displays without \
any issues."
echo "${VAR}"

결과:

This displays without any issues.

그러나 들여쓰기를 사용하면 다음과 같습니다.

    VAR="This displays with \
    extra spaces."
    echo "${VAR}"

결과:

This displays with      extra spaces.

이러한 공간이 없으면 어떻게 적절하게 할당할 수 있나요?

답변1

여기서 문제는 변수를 큰따옴표("")로 묶는 것입니다. 그것을 제거하면 모든 것이 잘 작동할 것입니다.

    VAR="This displays with \
    extra spaces."
    echo ${VAR}

산출

 This displays with extra spaces.

여기서 문제는 큰따옴표로 묶인 변수가 모든 공백 문자를 유지한다는 것입니다. 명시적으로 필요한 경우 사용할 수 있습니다.

예를 들어,

$ echo "Hello     World    ........ ...            ...."

인쇄할 것이다

Hello     World    ........ ...            ....

따옴표를 제거한 후 상황이 다릅니다.

$ echo Hello     World    ........ ...            ....
Hello World ........ ... ....

여기서 Bash는 텍스트에서 추가 공백을 제거합니다. 첫 번째 경우 전체 텍스트가 "단일" 인수로 처리되어 추가 공백이 유지되기 때문입니다. 그러나 두 번째 경우에는 echo명령이 텍스트를 5개의 매개변수로 받습니다.

명령에 인수를 전달할 때 변수를 인용하는 것도 도움이 됩니다.

다음 명령에서는 echo단일 매개변수만 가져옵니다."Hello World"

$ variable="Hello World"
$ echo "$variable"

그러나 다음의 경우에는 다음 과 echo같은 두 개의 매개변수가 있습니다 .HelloWorld

$ variable="Hello World"
$ echo $variable

답변2

주어진 해결책에르수그리고미카엘 부카스이 작업을 수행하는 일반적이고 더 이식 가능한 방법입니다.

다음은 몇 가지 솔루션입니다 bash(일부는 다른 셸에서도 작동합니다 zsh). +=정수 변수, 일반 변수 및 배열에 대해 약간 다르게 작동하는 추가 연산자를 사용하여 시작하십시오 .

text="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod "
text+="tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
text+="quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea ..." 

텍스트에 줄 바꿈(또는 다른 공백/이스케이프)을 원하면 $''따옴표를 사용하세요.

text=$'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n'
text+=$'...'

다음으로 다음을 사용하여 printf -v형식화된 값을 변수에 할당합니다.

printf -v text "%s" "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed " \
                    "do eiusmod empor incididunt ut labore et dolore magna aliqua. "\
                    "Ut enim ad minim veniam ..."

여기서 중요한 점은 형식 지정자보다 인수가 더 많다는 점입니다. 따라서 printf대부분의 함수와는 달리 bash는 형식 문자열을 모두 사용할 때까지 다시 사용합니다. \n형식 문자열에 a를 넣거나 $''(또는 둘 다)를 사용하여 공백을 처리할 수 있습니다 .

다음으로 배열을 사용합니다.

text=("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod "
      "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
      "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea ..." )

(참고 ) +=을 사용하여 한 줄씩 텍스트를 작성할 수도 있습니다 .()

text+=("post script")

하지만 여기서 전체 텍스트 콘텐츠를 한 번에 가져오려면 배열을 "평면화"해야 한다는 점을 기억해야 합니다.

echo "$text"      # only outputs index [0], the first line
echo "${text[*]}" # output complete text (joined by first character of IFS)

(정수 인덱스 배열은 연관 배열과 달리 암시적으로 정렬됩니다.) 이렇게 하면 행을 조작할 수 있으므로 더 많은 유연성을 얻을 수 있습니다.슬라이스와 주사위필요한 경우.

마지막으로 read또는 readarray"여기에 문서"를 사용하십시오.

read -r -d '' text <<-"EOT"
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
        tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 
        quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea ...
EOT

readarray -t textarray <<-"EOT"
        Lorem [...]
EOT  

여기서 문서 양식은 <<-모든 선행 하드 탭 문자가 입력에서 제거되므로 텍스트를 들여쓰려면 탭 문자를 사용해야 함을 의미합니다. 주변 따옴표는 "EOT"셸 확장 기능을 방지하므로 입력이 문자 그대로 사용됩니다. NUL 바이트를 사용 read하여 입력을 구분하므로 개행으로 구분된 텍스트를 한 번에 읽습니다. 배열을 읽고 각 줄에서 줄 바꿈을 제거하는 readarray(일명 , bash-4.0부터 사용 가능) 을 사용하십시오 .mapfile-t

답변3

제거할 특별한 heredoc 구문이 있습니다.모든 줄의 시작 부분: "<<-"(추가된 대시에 주의)

http://tldp.org/LDP/abs/html/here-docs.html

예제 19-4. 여러 줄 메시지, 탭 표시 안 됨

다음과 같이 사용할 수 있습니다.

v="$(cat <<-EOF
    A
        B
    C
EOF
)"
echo "$v"

결과:

A
B
C

공백이 아닌 탭에서만 작동합니다.

답변4

쉘이 원하지 않는 줄바꿈과 다음 공백을 먹도록 하십시오:

$ cat weird.sh 
#!/bin/sh

        var1="A weird(?) $(
             )multi line $(
             )text idea. $(
             )PID=$$"

        var2='You can '$(
            )'avoid expansion '$(
            )'too: PID=$$'

        var3='Or mix it: '$(
            )'To insert the PID use $$. '$(
            )"It expands to e.g. $$."

        echo "$var1"
        echo "$var2"
        echo "$var3"
$ sh weird.sh 
A weird(?) multi line text idea. PID=13960
You can avoid expansion too: PID=$$
Or mix it: To insert the PID use $$. It expands to e.g. 13960.

그래서 가능합니다... 하지만 확실히 이 솔루션을 좋아하고 좋아하지 않는 것은 취향의 문제입니다...

관련 정보