$ '$ foo'와 $“$ foo”의 차이점


9

변수 컨텍스트 내에서 작은 따옴표와 큰 따옴표 사이의 뉘앙스를 알아내는 데 어려움이 있습니다.

나는 정의한다 :

foo=pwd

그런 다음 다음을 실행하십시오.

echo $'$foo'

어떤 에코 $foo( $내 에코 명령에서 첫 번째 가 삭제 되었음을 의미 )

echo $"$foo"

이것은 반향됩니다 pwd(이것은 bash가 $foo내 변수 인 값으로 확장됨을 의미합니다 )

echo $`$foo`

마지막 으로이 에코 $~/scripts(나는 인쇄 ~/scripts하지 않을 것으로 예상 $~/scripts)

누군가가 이러한 차이점을 알아내는 데 도움을 줄 수 있습니까?

답변:


11

궁극적으로, 마지막 문자는 리터럴 과 명령 대체 의 조합 $~/scripts이기 때문에 인쇄 됩니다. 따라서 선행 은 리터럴로 해석되고 후행 은 명령 대체로 해석됩니다 .$`foo`$$$`$foo`


코드 태그를 제거하고``````문자 등으로 교체했습니다. 코드 태그를 선호하는 경우 롤백하십시오.
Tim

@Tim Thanks, 정확히 무엇을했는지 확실하지 않지만 편집 한 후 어떤 이유로 든 게시물이 첫 번째 개정판과 같이 중단 된 것처럼 보였으므로 다시 롤백했습니다 ... 이제 개정판에서 잘 보입니다. 무슨 일이 있었는지 확실하지 않으면 게시물을 다시 방해 할 수 있기 때문에 버전으로 롤백하기 전에 서식 샌드 박스에서 이것을 테스트 할 것입니다. 어쨌든 노력해 주셔서 감사합니다.
kos

물론 문제 없습니다. 내 너비가 0 인 공백을 사용하므로 편집 할 때주의하십시오.
Tim

2

첫 번째 경우 :

echo $'$foo'

어떤 에코 $foo( $내 에코 명령에서 첫 번째 가 삭제 되었음을 의미 )

첫 번째 $명령으로 실행됩니다. 에코는 인수 사이에 공백이 필요하지 않으며 인수 만 걸립니다.

따라서 echo는 $'$foo'확장되어 명령을 실행하고 (명령 $이 아니므로 무시합니다) echo '$foo'. 모든 ''것은 액면가로 취해 지거나 확장되지 않습니다. 원하는 것을 ''넣을 수 있으며 아무 일도 일어나지 않습니다.

바꿀 경우 $$$는 프로세스 ID를 메아리.


둘째:

echo $"$foo"

이것은 반향됩니다 pwd(이것은 bash가 $foo내 변수 인 값으로 확장됨을 의미합니다 )

""확장을 방해하지 않기 때문 입니다. ""일반적으로 비교할 값이 있는지 확인하는 데 사용됩니다.

비어있을 수있는 변수가있는 경우 (예 : grep결과 에서 나온) 다른 값 / 변수와 비교하려면 첫 번째 변수를에 넣어야합니다 "". 이를 통해 오류가 발생하는 빈 코드 섹션 (bash에서 볼 수 있음)이 아니라 항상 확인할 비교가 이루어집니다.


마지막으로 3 번입니다. 흥미 롭습니다.

echo $`$foo`

이 메아리 $~/scripts(인쇄 ~/scripts하지 않을 것으로 예상 $~/scripts)

(이 경우) echo가 $문자를 먼저 인쇄하기 때문 입니다. 백틱에 무언가를 넣으면 변수의 값이 명령으로 실행됩니다 (최신 버전의 bash에서 더 나은 방법은 $(command))

따라서 먼저 반향 $을 일으켜 실행되는 곳으로 확장 ​`$foo`​되어 ​`pwd`​돌아갑니다 ~/Scripts. 그러나 우리는 $이전 에 인쇄를 했으므로 전체 출력이 $~/Scripts됩니다.


매우 어려운 형식에 대한 좋은 작업!
Arronical

1
@Arronical Thanks :) 당신은 그것을 볼 수 없지만 마지막 문장에는 0 너비의 공백이 있습니다. 상상의 인터넷 포인트를 위해 내가하는 일 ...!
Tim

1
+1 좋은 답변입니다. 가능한 null 값을 처리 할뿐만 아니라 특별한 이유가 없다면 인용 변수가 기본값이어야한다고 덧붙입니다. 이것에 대해 알고 싶은 것보다 더 많은 것은 unix.stackexchange.com/questions/171346/… 를 참조하십시오 . ;)
Joe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.