이게 나를 미치게 만들었어요...
디렉토리에 있는 파일을 나열하고 싶고, 최신 파일을 제외한 모든 파일에 대해 번호를 기준으로 상호 작용하려면 다음 코드 조각이 있습니다.
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
sed
-n
'$c p'
FILEDIR=$(ls -1t [dir]*.log | sed -n '$c p')
하지만그러면 작은따옴표로 묶인 명령에서 변수 확장이 비활성화되는 문제에 직면하게 됩니다 sed
. 하나권장 방법다음과 같이 작은따옴표 인수를 분리하고 변수를 큰따옴표로 묶은 감탄사에 배치하는 것입니다.
FILEDIR=$(ls -1t [dir]*.log | sed -n "$c"' p')
또한 강제 경고를 발령해야 합니다.출력을 구문 분석하지 않습니다.ls
. ;)