Bash 여러 줄 문자열 변수 할당이 실패했습니다.

Bash 여러 줄 문자열 변수 할당이 실패했습니다.

Bash에서 이것이 잘 작동하는 이유는 무엇입니까?

$ cat test1.sh
#!/bin/bash
echo "some text" \
"some more text"
$ ./test1.sh
some text some more text

하지만 이건 실패했어

$ cat test2.sh
#!/bin/bash
text="some text" \
"some more text"
echo $text
$ ./test2.sh
./test2.sh: line 3: some more text: command not found

나는 둘 다 기대 test1.sh하고 test2.sh같은 일을합니다.

답변1

인용하다POSIX 쉘 명령 언어,

따옴표가 없는 <backslash>는 <newline>을 제외한 후속 문자의 리터럴 값을 유지합니다. <newline>이 <backslash> 뒤에 오면 쉘은 이를 줄 연속으로 해석합니다. 입력을 토큰으로 분할하기 전에 <backslash> 및 <newline>을 제거해야 합니다. 이스케이프된 <newline>은 입력에서 완전히 제거되고 공백으로 대체되지 않으므로 토큰 구분 기호로 사용할 수 없습니다.

이는 첫 번째 예에서 쉘이 실제로 수행하는 작업이 다음과 같다는 것을 의미합니다.

echo "some text" "some more text"

echo이는 표준 출력으로 인쇄할 때 공백 문자와 연결된 두 개의 인수가 뒤따르는 간단한 명령입니다 .

두 번째 예에서 쉘이 실제로 수행하는 작업은 다음과 같습니다.

text="some text" "some more text"
echo $text

첫 번째 줄은 변수 할당이 앞에 오는 간단한 명령 some more text(공백 문자를 포함한 단일 토큰) 으로 해석되고 text="some text"실행 echo $text됩니다.

첫 번째와 동일한 결과를 생성하려면 두 번째 스니펫을 다음과 같이 변경할 수 있습니다.

text="some text "\
"some more text"
echo "$text"

echo "$text"또한 쉘이 토큰화 및 파일 이름 생성을 적용하는 것을 방지하려면 의 큰따옴표 가 필요합니다 $text(단일 공백 ​​및/또는 와일드카드 이외의 공백 문자 시퀀스가 ​​포함된 경우를 제외하면 예제 문자열과 다르지 않습니다).

답변2

test1.sh에 echo제공된 모든 매개변수 ( "some text"첫 번째 매개변수 "some more text"와 두 번째 매개변수)를 인쇄합니다.

그리고 test2.sh는 잘못된 연결 방법을 사용하여 문자열을 연결하고 변수에 할당하려고 시도합니다.

여러 줄에 걸쳐 문자열을 나누려면 다음과 같이 닫는 따옴표를 생략하고 다음 줄에서 계속하세요.

text="some text \
some more text"

관련 정보