2016-09-19 4 views
0

대 커맨드 라인에서 서로 다른 결과를 얻을 수 있습니다. 그래서 myscript.ksh에 이런 짓을 : 나는 lastLine27의 기대 값을 수행 할 때

fileName=$1 
.... 
lastLine=`grep -n -m7 '\$' ${fileName}.asm | tail -n 1 | awk -F':' '{print $1}'` 
.... 
echo ${lastLine} 

7입니다. 여기 내가 작업하고있는 파일의 처음 30 줄이 있습니다.

$*********************************************************************** 
$ THE FOLLOWING BULK DATA ENTRIES RELATED TO EXT. SUPERELEMENT  5000 
$ ARE FOR USE IN THE MAIN BULK DATA PORTION OF THE ASSEMBLY RUN 
$*********************************************************************** 
$ 
SEBULK  5000EXTOP2   MANUAL      12 
$ 
SECONCT  5000  0    NO 
      60582 60582 180021 180021 180023 180023 180057 180057 
      180941 180941 180942 180942 180943 180943 180944 180944 
      180946 180946 180947 180947 204499 204499 231050 231050 
      231060 231060 232050 232050 232060 232060 252300 252300 
      252301 252301 253072 253072 253073 253073 401101 401101 
      401102 401102 401103 401103 401104 401104 402101 402101 
      402102 402102 402103 402103 402104 402104 403101 403101 
      403102 403102 403103 403103 403104 403104 404101 404101 
      404102 404102 404103 404103 404104 404104 405101 405101 
      405102 405102 405103 405103 405104 405104 406101 406101 
      406102 406102 406103 406103 406104 406104 407101 407101 
      407102 407102 407103 407103 407104 407104 408101 408101 
      408102 408102 408103 408103 408104 408104 631050 631050 
      631060 631060 632050 632050 632060 632060 652300 652300 
      652301 652301 653072 653072 653073 653073 662050 662050 
      662060 662060 677500 677500 677600 677600 678516 678516 
      678622 678622 679514 679514 679620 679620 703077 703077 
      703078 703078 1184100 1184100 1184200 1184200 1184400 1184400 
$ 
CORD2C*   220102   220104 0.000000000E+00 0.000000000E+00 
*  0.000000000E+00 0.000000000E+00 0.000000000E+00 0.100000000E+01 
*  0.100000000E+01 0.900000000E+02 0.100000000E+01 

내가하려는 것은이 단계에서이 파일의 SECONCT 항목을 다른 곳으로 복사하는 것입니다. SECONCT으로 시작하여 7th $으로 끝나는 것으로 알고 있습니다. 내가 커맨드 라인에서 작동하지만 스크립트에서는 작동하지 않는다고 말했다. 내가 명령 줄에서 "`"연산자를 사용하는 경우이 오류가 얻을 : 그래서이 해당 운영자에게 관련

-ksh: 7: not found [No such file or directory]

을하지만, 내가 전에이 문제를 가진 적이 없었습니다. 어떻게 수정해야합니까?

업데이트 : 는 여기 set -x 그것을 실행 한 출력 : 오류가 \$에서입니다

+ grep -n -m7 '$' sq93a3mkop2_4hz.asm 
+ awk -F: '{print $1}' 
+ tail -n 1 
+ lastLine=7 

$로 읽을. 하지만 어떻게 수정해야합니까?

+1

셸 스크립트를 디버깅하려면 처음에'set -x'를 입력하십시오. 그러면 모든 명령이 실행되고 모든 변수가 채워집니다. 이것은 대개 도움이됩니다. – Barmar

답변

1

나는 당신이 지나치게 복잡하다고 생각합니다.

이 섹션은 출력에 훨씬 간단한 방법입니다

sed -n '/SECONCT/,/^\$$/p' myfile.asm 

내가 ksh를 설치하지 않은, 그러나 이것은 CSH에서 작동합니다.

설명 :.

  • "-n"- 단지에 관심이 무엇 인쇄됩니다 나오지
  • "/ SECONCT /"- SECONCT 선이 나타날 때 시작합니다.
  • "/^\ $$ /"- "$"기호가있는 다음 줄이 나타나면 중지하십시오.
  • "p"- 두 패턴 사이의 모든 것을 인쇄합니다.
+0

감사합니다. 나는 분명히 복잡한 것을 끝내고있었습니다. 이것이 내가 배운 방법입니다. – Matt

1

`backticks`을 사용하여 중지하십시오. 대신 $(..) 사용

lastLine=$(grep -n -m7 '\$' ${fileName}.asm | tail -n 1 | awk -F':' '{print $1}') 

역 따옴표는 특정 문자의 특별한 이스케이프의 새 레이어 부과되는 하나의 몇 가지 단점과 기존의 구문은 다음과 같습니다

$ echo '\$' 
\$ 

$ echo "`echo '\$'`" # Working command produces different results in backticks 
$ 

$ echo "`echo '\\$'`" # ... and requires another layer of escaping. 
\$ 

$ echo "$(echo '\$')" # $() just works. 
\$ 

현대 명령 치환, $(..)을 가지고 있지 않습니다 이러한 문제는 수정되지 않은 명령을 래핑 할 수있게 해줍니다. $(..)은 POSIX이므로 backticks를 사용할 이유가 없습니다.

+0

[추가 정보 링크] (http://mywiki.wooledge.org/BashFAQ/082) –