BASH 스크립트가 "예기치 않은 파일 끝"을 반환합니다.

BASH 스크립트가 "예기치 않은 파일 끝"을 반환합니다.

왜 내가 이것을 받고 있는지 잘 모르겠습니다. 나는 이것이 일반적인 문제임에 틀림없다는 것을 알고 있지만 그것을 알아낼 수는 없습니다.

#!/bin/bash
 #Checks word count of each text file directory and deletes if less than certain   amount of words
 #Lastly, displays number of files delter

 count = 0 #Set counter to 0
 limit = 2000

 for file in *.txt
 do
     words = wc -w > $file
     if words < $limit
         rm $file
         count = $count + 1
     end
 end

 print "Number of files deleted: $count" 

답변1

유감스럽게도 귀하의 스크립트에 구문 오류가 가득합니다. 귀하가 보고 있는 구체적인 오류는 for루프를 제대로 닫지 않았기 때문이지만 그 외에도 훨씬 더 많은 오류가 있습니다.

  1. =변수에 값을 할당할 때 공백을 사용할 수 없습니다(산술 표현식 제외).
  2. 명령의 출력을 변수에 저장하려면 다음을 사용해야 합니다.명령 대체, var=`command`어느 하나 var=$(command);
  3. 변수 값을 인용할 때는 $var대신 를 사용해야 합니다. var일반적으로 "$var"따옴표()로 묶어야 합니다.
  4. 로서산술 비교, 이중 대괄호를 사용 -lt하지 않는 한 명령을 사용해야 합니다 .[<
  5. command > file형식은 file명령의 출력으로 덮어쓰여집니다. wc < "$file"대신 사용하고 싶을 수도 있습니다 wc > $file.
  6. var=$var+1변수가 이전에 정수로 선언되지 않은 경우 변수에 값을 사용 ((var=var+1))하거나 추가할 수 없습니다 . 1을 추가하려면 다음을 사용할 수도 있습니다 .var=$((var+1))declare -i var; var=var+1((var++))
  7. 구문 if이 잘못되었습니다. 올바른 형식은 다음과 같습니다.if condition; then do something; fi
  8. for 루프에서도 마찬가지 입니다 . for올바른 구문은 다음과 같습니다.for loop-specification; do something; done
  9. 명령 은 없습니다 print(어쨌든 bash에 내장되어 있지 않음). 단지 printfecho;
  10. 당신은해야항상 변수를 인용하세요.그렇게 하지 않을 타당한 이유가 없다면 말이죠.

따라서 스크립트의 약간 개선된 작업 버전은 다음과 같습니다.

#!/bin/bash -
# Checks word count of each text file directory and deletes if less than certain   amount of words
# Lastly, displays number of files deleted

count=0 # Set counter to 0
limit=2000

for file in *.txt
do
     words=$(wc -w < "$file")
     if [ "$words" -lt "$limit" ]
     then
         rm -- "$file"
         ((count++))
     fi
done

echo "Number of files deleted: $count" 

다음에는 코딩을 시도하기 전에 언어에 익숙해지는 것이 좋습니다. 모든 언어에는 고유한 규칙과 문법이 있습니다.

답변2

루프 종결자가 올바르지 않습니다. 루프는 가 아닌 에 의해 종료됩니다 for. 마찬가지로 조건은 종료에 의해 종료되는 것이 아니라 종료에 의해 종료됩니다.doneendiffiend

이것은 Bourne/POSIX 쉘 구문 계열입니다. 다른 쉘에는 실제로 이 두 가지로 끝나는 것이 있을 수 있지만 end이는 bash사실이 아닙니다.

답변3

words = wc -w > $file

여기 등장인물들은 >어울리지 않는 것 같아요. 그것이 없으면 줄 수를 계산하게 되지만 $file현재로서는 stdin의 줄 수를 계산하고 결과를 $file.

관련 정보