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"