긴 문자열을 여러 줄로 나누고 Linux bash 스크립트에서 변수에 할당하는 방법

긴 문자열을 여러 줄로 나누고 Linux bash 스크립트에서 변수에 할당하는 방법

긴 문자열 값을 가진 변수가 포함된 bash 스크립트를 작성하려고 합니다. 문자열을 여러 줄로 나누면 오류가 발생합니다. 문자열을 여러 줄로 나누고 변수에 할당하는 방법은 무엇입니까?

답변1

배열의 여러 하위 문자열에 긴 문자열을 할당하면 코드가 더욱 아름다워질 수 있습니다.

#!/bin/bash

text=(
    'Contrary to popular'
    'belief, Lorem Ipsum'
    'is not simply'
    'random text. It has'
    'roots in a piece'
    'of classical Latin'
    'literature from 45'
    'BC, making it over'
    '2000 years old.'
)

# output one line per string in the array:
printf '%s\n' "${text[@]}"

# output all strings on a single line, delimited by space (first
# character of $IFS), and let "fmt" format it to 45 characters per line
printf '%s\n' "${text[*]}" | fmt -w 45

반대로 수행합니다. 즉, 긴 줄을 여러 줄로 나누고 배열 변수로 읽습니다.

$ cat file
Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old.

fmt여기서는 행을 최대 30자 길이의 더 짧은 행으로 분할한 다음 셸 에서 이 행을 다음이라는 이름의 배열로 readarray읽 습니다 .bashtext

$ readarray -t text < <(fmt -w 30 file)

이제 행 그룹이나 각 개별 행에 액세스할 수 있습니다.

$ printf '%s\n' "${text[@]}"
Contrary to popular belief,
Lorem Ipsum is not simply
random text. It has roots in a
piece of classical Latin
literature from 45 BC, making
it over 2000 years old.
$ printf '%s\n' "${text[3]}"
piece of classical Latin

(배열은 0부터 시작합니다 bash.)

답변2

추천:

x='Lorem ipsum dolor sit amet, consectetur '\
'adipiscing elit, sed do eiusmod tempor '\
'incididunt ut labore et dolore magna aliqua.'

결과는 다음과 같습니다.

$ printf '%s\n' "$x"
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

답변3

요점은 매우 긴 줄을 쉘 변수에 저장하는 것이지만 Bourne과 같은 쉘을 가정하고 코드가 특정 고정 너비 내에서 그렇게 하도록 하는 경우 다음을 수행할 수 있습니다.

string="Rerum inventore nemo neque reiciendis ullam. Volupta\
te amet eveniet corporis nostrum. Laboriosam id sapiente atq\
ue non excepturi. Dolorem alias sed et voluptatem est unde s\
ed atque. Itaque ut molestias alias dolor eos doloremque exp\
licabo. Quas dolorum sint sit dicta nemo qui."

작은 따옴표와 달리 큰 따옴표 내에서 백슬래시 줄 바꿈은 여전히 ​​줄 연속으로 간주됩니다. 큰따옴표 안의 , , "는 ( 때때로 ) 여전히 특별하므로 이스케이프해야 합니다.$`\!

참조에 대한 걱정을 피하는 방법은 다음과 같이 작성하는 것입니다.

string=$(<<'EOF' tr -d '\n'
Rerum inventore nemo neque reiciendis ullam. Vo
luptate amet eveniet corporis nostrum. Laborios
am id sapiente atque non excepturi. Dolorem ali
as sed et voluptatem est unde sed atque. Itaque
 ut molestias alias dolor eos doloremque explic
abo. Quas dolorum sint sit dicta nemo qui. 'And
'#\`"$% whatever.
EOF
)

구분 기호를 인용 하면 <<부분적으로라도 여기 문서 본문에서는 확장이 수행되지 않습니다. 여기에서는 출력을 캡처 tr하여 here 문서에 공급하고 문서에서 ewline 문자를 d제거합니다 . n들여쓰기를 추가하려면 다음과 같은 것을 사용할 수 있습니다.

string=$(<<'EOF' cut -b3- | tr -d '\n'
  Rerum inventore nemo neque reiciendis ullam. Vo
  luptate amet eveniet corporis nostrum. Laborios
  am id sapiente atque non excepturi. Dolorem ali
  as sed et voluptatem est unde sed atque. Itaque
   ut molestias alias dolor eos doloremque explic
  abo. Quas dolorum sint sit dicta nemo qui. 'And
  '#\`"$% whatever.
EOF
)

답변4

저는 이것을 명령줄 프롬프트에 씁니다. 물론 더 압축할 수도 있지만 명확성을 위해 다음과 같이 합니다.

~$ text='You can do this, but the newlines will be embedded in the variable, so it won’t be a single line'

~$ array=$(echo $text | cut -d' ' -f 1-)

~$ for x in ${array[@]}; do echo $x ; done

이것은 한 줄입니다.

~$ echo $text | tr ' ' '\n'

산출:

You
can
do
this,
but
the
newlines
will
be
embedded
in
the
variable,
so
it
won’t
be
a
single
line

또는 정렬된 출력의 경우:

~$ echo $text | tr ' ' '\n' | sort

산출:

a
be
be
but
can
do
embedded
in
it
line
newlines
single
so
the
the
this,
variable,
will
won’t
You

관련 정보