변수 값을 스크립트에 전달하고 한 줄로 실행하는 방법은 무엇입니까?

변수 값을 스크립트에 전달하고 한 줄로 실행하는 방법은 무엇입니까?

다음 줄이 포함된 파일(temp_4n.in)이 있습니다.

 5  C   172.0696  
 5  C   135.6942  
 5  H   30.9062  
 5  H   31.8124  
 12 H   31.0377  
 12 O   293.0612  
 12 H   32.4678  

특정 숫자로 시작하는 마지막 H줄을 추출하는 스크립트(testsc.txt)가 있습니다. 이 숫자는 주기적으로 변경됩니다.

 grep $'^${mold}\tH' temp_4n.in | tail -1 > temp_5n.in

그러나 다음 명령을 사용하여 스크립트를 실행하면(예: 12로 시작하는 줄을 원함) 실패합니다.

 qsub -v mold=12 ./testsc.txt

나는 이것이 grep 명령의 첫 번째 "$"가 인수로 처리되어 잘못 대체되는 것과 관련이 있다고 생각합니다. 누구든지 문제를 파악하도록 도와줄 수 있나요?

답변1

qsub -v varname=value설정은 제출된 작업 환경 varname에서 제공됩니다.value

제출한 스크립트의 명령에서 이 값을 사용 grep하지만 변수가 포함된 문자열은 셸이 확장되지 않도록 작은따옴표로 묶여 있습니다.

스크립트는 다음을 사용해야 합니다.

grep "^$mold[[:blank:]]H" temp_4n.in | tail -1 > temp_5n.in

여기서는 $코드의 첫 번째 문자( )가 필요하지 않으며 대신 공백이나 탭을 일치시키는 데 사용됩니다.$'...'[[:blank:]]


또 다른 방법은 awk스크립트에서 사용하는 것입니다.

awk -v mold="$mold" '$1 == mold && $2 == "H" { this = $0 } END { print this }' temp_4n.in >temp_5n.in

이는 문자열 비교(정규식이 아님)를 사용하여 첫 번째와 두 번째 열을 테스트하고, 일치하는 행이 발견되면 전체 행이 변수에 저장됩니다 this. 마지막으로 this마지막 값이 인쇄됩니다. 이는 grep및 를 대체합니다 tail.

관련 정보