여러 줄 셸 변수를 지정하는 방법은 무엇입니까?


122

쿼리를 작성했습니다.

function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}

로컬 SQL-매우 긴 문자열. 쿼리 형식이 지정되지 않았습니다. 문자열을 여러 줄로 분할하려면 어떻게해야합니까?


4
여기서 무슨 말 shell을 잘하고 있습니까? 해야 batchbash하거나 닥 사이드에서 정말?
Chris Seymour

1
쉘 / bash 인 경우 =공백으로 둘러싸 지 않아야 합니다.
Nik O'Lai

답변:


138

read아래와 같이 heredoc과 함께 사용하십시오 .

read -d '' sql << EOF
select c1, c2 from foo
where c1='something'
EOF

echo "$sql"

52
참고 read이 상황에서 하나의 종료 코드를해야합니다; 그게 중요한 경우 ( set -e예 :를 사용 하여 실행 중임 ) || true첫 번째 줄 끝에 a 를 추가 할 수 있습니다 .
chepner 2013 년

4
set -e명령이 "예기치 않은"0이 아닌 종료 상태 인 경우 쉘을 종료합니다. "예상되지 않음"이란 종료 상태를 구체적으로 보지 않는 컨텍스트에서 실행된다는 의미입니다. false예를 들어, 자체적으로 쉘을 종료합니다. false || true첫 번째 명령이 실패 할 경우 실행할 다른 명령을 지정하여 0이 아닌 종료 상태를 예상하므로 그렇지 않습니다.
chepner

1
set -e 및 읽기 (마지막 연습 참조)의 문제는 여기에 자세히 설명되어 있습니다. mywiki.wooledge.org/BashFAQ/105
Niklas Peter

5
무엇을 않습니다 -d ' '여기합니까?
hg_git 2013-09-26

3
@hg_git read줄 바꿈을 만났을 때 읽기를 멈추지 말라고합니다.
Cyker

170

필요한 곳에 새 줄을 삽입하기 만하면됩니다.

sql="
SELECT c1, c2
from Table1, Table2
where ...
"

쉘은 닫는 따옴표를 찾습니다.


7
SQL 쿼리에 큰 따옴표가 포함 된 경우 좋은 솔루션이 아닙니다. 당신은 그들을 피해야 할 것이고 그것은 지저분해질 것입니다.
dogbane 2013 년

13
@dogbane 큰 따옴표는 대부분의 SQL 방언에서 거의 나타나지 않으므로 실제로는 깨끗합니다.
Iain Samuel McLean Elder

4
그런 다음 문자열을 작은 따옴표로 묶습니다.
tripleee

줄 바꿈을 원하거나 필요한 이유를 잘 모르겠습니다. 내 응용 프로그램을 위해 나는 그래서 난 그냥 시작하지 않았다sql="SELECT c2, c2
bhfailor

1
사실 이라기에는 너무 쉬운 것 같아 웃기다. 참고로 DQ를 추가하려면 변수 DQ = '\ "'를 만든 다음 $ {DQ}를 사용하여 문에서 참조하십시오.
Timothy C. Quinn

69

하나의 추가 답변을 드리고 싶지만 대부분의 경우 다른 답변으로 충분합니다.

여러 줄에 걸쳐 문자열을 쓰고 싶었지만 그 내용은 한 줄이어야했습니다.

sql="                       \
SELECT c1, c2               \
from Table1, ${TABLE2}      \
where ...                   \
"

약간의 주제에서 벗어난 경우 죄송합니다 (SQL에는 필요하지 않았습니다). 그러나이 게시물은 여러 줄 셸 변수를 검색 할 때 첫 번째 결과 중 하나이며 추가 답변이 적절 해 보였습니다.


1
\ 's 없이도 내 콘텐츠가 한 줄로 나옵니다.
파피로

12
@papiro, echo "$sql"대신 echo $sql.
Michael Mol

@MichaelMol-처음으로 Linux를 설치 한 지 약 20 년이 지났지 만 여전히 새로운 것을 배웁니다. 이 "트릭"에 감사드립니다.
Seth

6

비슷한 질문에 대한 dimo414의 답변 덕분에 그의 훌륭한 솔루션이 어떻게 작동하는지 보여주고 텍스트에 따옴표와 변수를 쉽게 넣을 수 있음을 보여줍니다.

예제 출력

$ ./test.sh

The text from the example function is:
  Welcome dev: Would you "like" to know how many 'files' there are in /tmp?

  There are "      38" files in /tmp, according to the "wc" command

test.sh

#!/bin/bash

function text1()
{
  COUNT=$(\ls /tmp | wc -l)
cat <<EOF

  $1 Would you "like" to know how many 'files' there are in /tmp?

  There are "$COUNT" files in /tmp, according to the "wc" command

EOF
}

function main()
{
  OUT=$(text1 "Welcome dev:")
  echo "The text from the example function is: $OUT"
}

main

5

read변수를 내 보내지 않습니다 (대부분의 경우 좋은 일입니다). 여기에 하나의 명령으로 내보낼 수 있고, 줄 바꿈을 유지하거나 삭제할 수 있으며 필요에 따라 인용 스타일을 혼합 할 수있는 대안이 있습니다. bash 및 zsh에서 작동합니다.

oneLine=$(printf %s \
    a   \
    " b "   \
    $'\tc\t'    \
    'd '    \
)
multiLine=$(printf '%s\n' \
    a   \
    " b "   \
    $'\tc\t'    \
    'd '    \
)

인용의 필요성이 SQL에 대해 추악하다는 것을 인정하지만 제목의 (보다 일반적으로 표현 된) 질문에 답합니다.

나는 이것을 이렇게 사용한다

export LS_COLORS=$(printf %s    \
    ':*rc=36:*.ini=36:*.inf=36:*.cfg=36:*~=33:*.bak=33:*$=33'   \
    ...
    ':bd=40;33;1:cd=40;33;1:or=1;31:mi=31:ex=00')

my .bashrc.zshrc.

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