쉘 변수를 사용하여 '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]*.log해당 출력은 sedoptions 및 인수를 통해 -n실행 파일로 파이프됩니다 '$c p'. 다음과 같은 큰따옴표를 제거해 보세요.

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

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

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

그리고 의무적으로 경고를 해야 합니다.출력을 구문 분석하지 않습니다.ls. ;)

관련 정보