2012-03-23 10 views
0

명령을 받아서 출력 파일의 존재 여부에 따라 실행하는 checkExist 함수가 있습니다. 나는 명령이 생성 출력 파일의 단지 이름 파일 2있는 파일 1과 같은 명령을 통과, 그래서 그들은 이미 덮어 쓸 경우는, 다른 물을 것이다 존재하는 경우는 건너 뜁니다 :작은 따옴표로 awk 명령을 실행하십시오.

checkExist file1 file2 command1 command2 

에서

checkExist 1.txt 2.txt "echo $1 | awk '$5 <= 10 {print $3, $4}'" "echo $2 | awk '$5 <= 10 {print $3, $4}'" 

위의 $ 1 및 $ 2는 checkExist within 함수를 포함하는 스크립트 "smartfilter.sh"에 대한 입력입니다. 그래서 그들은 단지 파일 입력 일뿐입니다.

: 사용자 유형 'Y/y는'덮어 쓰기, 또는 파일이 이미

eval $3 & 
eval $4 & 
wait 

은 내가과 같이 오류가 발생합니다 다음 존재하지 않는 경우 나중에 checkExist 기능에

awk: >= 10 {print , } 
awk:^syntax error 
awk: >= 10 {print , } 
awk:    ^syntax error 
awk: >= 10 {print , } 
awk:    ^syntax error 
awk: cmd. line:1: >= 10 {print , } 
awk: cmd. line:1:    ^unexpected newline or end of string 

awk와 eval 주위에 작은 따옴표 '을 올바르게 구문 분석하지 않는 것이 좋습니다. \' 시도했지만 그 중 하나가 작동하지 않습니다. 이것을 할 수있는 적절한 방법이 있습니까?

답변

2
checkExist 1.txt 2.txt "echo $1 | awk '\$5 <= 10 {print \$3, \$4}'" "echo $2 | awk '\$5 <= 10 {print \$3, \$4}'" 
+0

논리를 설명해 주시겠습니까? –

+0

셸은 큰 따옴표 문자열 내에서 변수 대체를 수행하므로 '$ 3'및 '$ 4'을 (해당 변수가 설정되지 않았기 때문에) 대체되지 않습니다. 작은 따옴표는 큰 따옴표 안에 들어 있기 때문에 쉘에 의해 무시됩니다 (그러나 awk로는 무시됩니다). 방금 달러를'\'로 인용 했으므로 쉘은 변수를 변수라고 생각하지 않습니다. 쉘은'\'따옴표를 없애므로 awk이 올바른 일을합니다. (쉘과 awk 둘 다 인용하고 싶다면'\\\ ''라고 말해야한다.) 내가 뭐라고 할 수 있니? 인용 수준은 흑 마법입니다. – ams

+0

당신은 마법사입니다 내 친구 –

관련 문제