쉘 변수를 사용하는 "sed" 명령을 실행하는 중 오류가 발생했습니다.

쉘 변수를 사용하는 "sed" 명령을 실행하는 중 오류가 발생했습니다.

이게 나를 미치게 만들었어요...

디렉토리에 있는 파일을 나열하고 싶고, 최신 파일을 제외한 모든 파일에 대해 번호를 기준으로 상호 작용하려면 다음 코드 조각이 있습니다.


FILECOUNT=$(ls -lt [dir]*.log | grep -c .log )
for (( c=2; c<=$FILECOUNT; c++ ))
do
FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")

해석 에 문제가 있습니다 $c. 위의 형식은 작동하지만 sed 명령은 실패합니다... cli에 로그의 마지막 줄을 입력하면 매력처럼 작동하지만


 FILECOUNT=24

 (( c=2 ))

 (( c<=24 ))

C is : 2

 'ls -1t [dir]*.log | sed -n '\''2 p'\'''

 line 41: ls -1t [dir]*.log | sed -n '2 p': No such file or directory

어떤 도움이라도 대단히 감사하겠습니다!

분명히 [dir]유효한 디렉토리입니다

답변1

가장 큰 문제는 명령 대체의 모든 내용을 큰따옴표로 묶는 것입니다.

FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")

이는 쉘이 다음을 사용하여 실행 파일을 찾도록 지시합니다.축어적 이름 ls -1t [dir]*.log | sed -n '$c p'"ls옵션 및 인수를 사용 하여 실행 파일로 출력이 파이프되는 옵션 -1t및 피연산자를 사용 하여 명령을 실행하는 것과는 달리 인수가 없습니다 . 다음과 같이 큰따옴표를 제거해 보십시오.[dir]*.logsed-n'$c p'

FILEDIR=$(ls -1t [dir]*.log | sed -n '$c p')

하지만그러면 작은따옴표로 묶인 명령에서 변수 확장이 비활성화되는 문제에 직면하게 됩니다 sed. 하나권장 방법다음과 같이 작은따옴표 인수를 분리하고 변수를 큰따옴표로 묶은 감탄사에 배치하는 것입니다.

FILEDIR=$(ls -1t [dir]*.log | sed -n "$c"' p')

또한 강제 경고를 발령해야 합니다.출력을 구문 분석하지 않습니다.ls. ;)

관련 정보