"!"를 에코하면 문자열 내부에서 이상한 일이 발생합니다.

"!"를 에코하면 문자열 내부에서 이상한 일이 발생합니다.

다음을 입력하면:

echo "Hello, World!"

이름이 무엇인지는 모르겠지만 다음 줄로 이동하라는 메시지가 표시됩니다. 당신은 이것을 알고 있습니다 PS2. 또는 을 입력 echo \하고 누르는 경우 Enter.

왜?

글쎄, 나도 그게 !하나라는 걸 알아특수 변수이를 사용하여 기록을 참조할 수 있습니다.

하지만 일단 이것을 사용하면:

echo "Hello, World"!

내가 원하는 결과를 얻습니다. 무슨 일이 일어나고 있으며 왜 !내부적으로 사용할 수 없습니까 ""?


당신의 도움을 주셔서 감사합니다:)

답변1

!특별한 변수가 아닙니다. ( !로 접근할 수 있는 이라는 변수가 있지만 $!관련은 없습니다.) Bash가 보는 위치와 뒤에 오는 내용에 따라 특별한 의미를 갖는 문자입니다.

캐릭터 !시작역사적 확장. Bash는 대화형으로 명령을 읽을 때(대화형 명령줄의 스크립트라도 스크립트를 실행할 때가 아니라) 명령줄 구문 분석 초기에 기록 .확장을 수행합니다 source. 변수를 설정할 수 있습니다histchars대신 다른 문자를 선택하십시오 !(그러나 대부분의 다른 ASCII 문자는 일반적인 사용법과 충돌합니다).

수치! 기록 교체 시작

공백, 탭, 줄 끝, "=" 또는 "("(내장된 shopt를 사용하여 extglob 쉘 옵션이 활성화된 경우)가 뒤에 오지 않는 한.

echo "Hello, world"!따라서 또는 같은 것들은 if ! grep -q foo myfile; …기록 확장을 유발하지 않습니다.

반품아포스트로피그리고달러 작은따옴표히스토리 확장을 방지합니다(즉, 히스토리 확장 문자는 포함될 때 특별한 의미가 없습니다 '…'). 문자를 인용하는 백슬래시는 해당 문자가 히스토리 확장을 시작하지 못하도록 보호합니다.큰따옴표아니요, 제외하고(배쉬 4.4부터 시작), POSIX 호환 모드에서 bash가 호출되는 경우. 즉, 기본적으로

echo "!foo"

!foo큰따옴표로 대체되는 기록 참조를 만듭니다 . echo "\!foo"백슬래시가 포함되므로 큰따옴표로 묶인 문자열에 실제 느낌표를 포함할 수는 없습니다 . echo \!"foo"또는 와 같은 것을 사용해야 합니다 echo '!foo'. Bash가 왜 이렇게 하는지는 모르겠습니다. 이는 1980년대에 만들어진 디자인 결정이었습니다. (Bash는 csh에서 히스토리 확장을 상속하지만 더 나쁩니다. 작은 따옴표라도 히스토리 확장을 막지는 못합니다.)

하지만 이 정확한 상황을 재현할 수는 없습니다.

bash-5.0$ echo "Hello, World!"
Hello, World!

그러나 이는 bash 버전이나 구성에 따라 달라질 수 있습니다. 큰따옴표 자체는 기록 확장을 억제하지 않습니다. 실제로 !"어떤 형식에도 적합하지 않습니다 .이벤트 표시기.

bash-5.0$ echo "Hello!world"
bash: !world: event not found`

답변2

태그로 사용한다고 가정하면 bash큰따옴표 대신 작은따옴표를 사용하세요.

echo 'Hello, World!'
Hello, World!

그러나 나는 당신이 를 사용할 가능성이 더 높다고 생각하며 zsh동일한 수정 사항이 적용됩니다.

echo "Hello, World!"
dquote>

echo 'Hello, World!'
Hello, World!

바라보다셸에서 "...", '...', $'...' 및 $"..." 따옴표의 차이점은 무엇입니까?다양한 유형의 견적과 이를 사용하는 경우(사용하지 않는 경우)에 대한 자세한 정보입니다.

관련 정보