2012-03-16 3 views
1

당신이 설명해 주시겠습니까 CSH의 문자열을 추출 :다음 쉘 명령이 작동하지 왜

sh-3.1$ echo $MYPATH 
/opt/Application/DATA/CROM/my_application 
sh-3.1$ awk '{print substr($MYPATH,3)}' 

감사 베스트 감사합니다

답변

1

MYPATH은 문자열이 작은 따옴표를 사용하기 때문에 셸로 대체되지 않습니다. 다음 고려 :

csh$ echo '{print substr($USER,3)}' 
{print substr($USER,3)} 
csh$ echo "{print substr($USER,3)}" 
{print substr(dshawley,3)} 

단일 따옴표의 사용은-그대로 프로그램에 문자열 인수를 전달하는 쉘을 지시합니다. Double 따옴표는 프로그램에 전달하기 전에 인수에 변수 확장을 수행하도록 쉘에 지시합니다. 이것은 셸과 일부 프로그래밍 언어 (예 : perl)간에 공통적 인 기본 셸 기능입니다.

다음 문제는 awk은 첫 번째 매개 변수를 따옴표로 묶어 substr으로 지정하면 구문 분석이 실패합니다. 이 경우 "잘못된 변수 이름"경고가 표시됩니다. 이것은 인용 된 문자열 내에서 큰 따옴표를 올바르게 이스케이프 처리하지 못하기 때문에 csh으로 잃어버린 곳입니다. bash는/쉬/KSH에서 다음을 수행 할 것입니다 :

sh$ awk "{print substr(\"$USER\",3)}" 
input 
^D 
hawley 
sh$ 

당신이 이미 알고하지 않습니다 그냥 경우, awk는 아무것도 할 것입니다 전에 입력 스트림을 필요로 할 것이다. 작은 예제에서는 "input"과 EOF 문자를 입력해야했습니다.

1

Quoting and escaping

"string" is a weak quote. Enclosed whitespace and wildcards are taken as literals, but variable and command substitutions are still performed. 
'string' is a strong quote. The entire enclosed string is taken as a literal. 

당신은 -v을 사용할 수 있습니다 변수를 전달할 수있는 옵션을 awk :

awk -v mypath=$MYPATH 'BEGIN{print substr(mypath, 3)}' 
+0

BTW - 이것은 실제로 두통을 인용하는 쉘을 피할 수 있기 때문에 내가 제시 한 것보다 훨씬 더 나은 옵션입니다. –

관련 문제