2012-08-15 3 views
38

, 가감. 그래서 작은 따옴표를 사용하는 것에 대해 생각합니다.

다음이 작동하지 않습니다하지만 :

program 'don\'t do this'   //escape doesn't work in single quote 

을 다음 두 가지 작동하는 동안 :

program $'dont\'t do this'   //seems fine, but any other side effects? 
program 'dont'\''do this'   //breaking into 3 parts 

첫 번째 방법은 덜 사전에 수정을 획득하는 것이 더 나은 것 같다 (앞에 달러 기호를 넣어 \\\으로 대체하십시오.)하지만 나는 무엇을해야 할 지 모르겠다.

난 정말이 봤했지만 내가 필요한 것을 찾을 수 없습니다 ...

+4

'$'... '예제를 더 잘 이해하려면 [bash info page] (http://www.gnu.org/software/bash)의 첫 번째 단락을 살펴보십시오. /manual/html_node/ANSI_002dC-Quoting.html#ANSI_002dC-Quoting) – suvayu

+0

이 질문을 게시 해 주셔서 감사합니다. 탭으로 구분 된 레코드 (예 :'cat myData.tsv | column -t -s $ '\ t'')를 정렬하는 방법을 이해하는 것은 매우 중요합니다. –

답변

48

그것은 이스케이프 시퀀스는 해석됩니다.

$ echo $'Name\tAge\nBob\t24\nMary\t36' 
Name Age 
Bob  24 
Mary 36 

은 (그리고 바보 같은 방식으로 탭을 처리하는, 그래서 집에서 이것을 시도) 접두사가 해당 이름을 가진 변수를 찾으려고 BASH 지시로 $를 사용

+0

+1 좋은 캐치.변수 이름이 확장 되었기 때문에 이런 일이 일어난 것 같아요? –

+0

아니요, 이것은'$ '...''에 대해 정의 된 동작이기 때문에 발생합니다. –

+0

이것은 이것이 모두 $ ''인 경우 정확히 필요한 것입니다! – user1206899

18

합니다. $'은 ANSI-C 문자열 처리를 가능하게하는 특수 구문 (fully explained here)입니다. 이 경우, 단일 진드기는 "다음 단일 진드기 전까지 축 어적으로 가치가 없습니다". 사용하기에 안전해야합니다. 단점은 그것이 바스 일 뿐이며 아주 드문 일이기 때문에 많은 사람들이 그것이 무엇을 의미하는지 궁금해 할 것입니다.

더 좋은 방법은 작은 따옴표를 사용하는 것입니다. 문자열에 작은 따옴표가 필요하면 '\''으로 바꿔야합니다. 이전 작은 따옴표로 묶은 문자열을 끝내고 작은 따옴표를 추가 한 다음 (\') 작은 따옴표로 묶은 새 문자열을 시작합니다. 이 구문은 Bourne shell의 하위 클래스에서 작동하며 이해하기 쉽고 대부분의 사람들은 패턴을 빨리 인식합니다.

대안은 각 단일 눈금을 '"'"'으로 바꾸는 것으로 "현재 단일 인용 문자열 끝내기, 한 눈금 만 포함하는 큰 따옴표 문자열 추가, 작은 따옴표 문자열 다시 시작"으로 변환됩니다. 이것은 이스케이프 문자를 피하고 멋지게 대칭으로 보입니다. 큰 따옴표로 묶인 문자열에 큰 따옴표가 필요하면 다른 방법으로도 작동합니다 : "'"'". 당신은보다 빠르거나 더 효율적으로 찾을 수 없습니다

+0

예 올바른 방법입니다. – user1206899

+2

" '"' " ''을 (를) 볼 수도 있습니다. 예를 들어''개 '' ''꼬리 '' –

+0

$ '쉘'과 $ '랜 그'는 실패하지 않을 것입니다. $ '의 달러 기호는 다른 기능을합니다. 나는 '\'이 * 하나 * 올바른 방법이라고 말하고 싶습니다. – jox

-1

: 하나

eval RESULT=\$\'$STRING\' 

,이 평가가 있다는 것을 물건의 종류, 당신은 하위 프로세스를 분기의 미친 비용을 피하기 이전의 대답이 암시하는 것처럼 모든 곳에서. 예 :

$ foo='\u25b6' 
$ eval bar=\$\'$foo\' 
$ echo "$bar" 
▶ 
+0

이것은 Bash에서 구문의 의미를 오해 한 것입니다. '$ '...'는 일반 문자열보다 다른 인용 규칙을 따르는 [C 스타일 문자열] (http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting)입니다. 이 페이지의 다른 답변에 요약되어 있습니다. – tripleee