왜 내가 이것을 받고 있는지 잘 모르겠습니다. 나는 이것이 일반적인 문제임에 틀림없다는 것을 알고 있지만 그것을 알아낼 수는 없습니다.
#!/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
루프를 제대로 닫지 않았기 때문이지만 그 외에도 훨씬 더 많은 오류가 있습니다.
=
변수에 값을 할당할 때 공백을 사용할 수 없습니다(산술 표현식 제외).- 명령의 출력을 변수에 저장하려면 다음을 사용해야 합니다.명령 대체,
var=`command`
어느 하나var=$(command)
; - 변수 값을 인용할 때는
$var
대신 를 사용해야 합니다.var
일반적으로"$var"
따옴표()로 묶어야 합니다. - 로서산술 비교, 이중 대괄호를 사용
-lt
하지 않는 한 명령을 사용해야 합니다 .[
<
- 이
command > file
형식은file
명령의 출력으로 덮어쓰여집니다.wc < "$file"
대신 사용하고 싶을 수도 있습니다wc > $file
. var=$var+1
변수가 이전에 정수로 선언되지 않은 경우 변수에 값을 사용((var=var+1))
하거나 추가할 수 없습니다 . 1을 추가하려면 다음을 사용할 수도 있습니다 .var=$((var+1))
declare -i var; var=var+1
((var++))
- 구문
if
이 잘못되었습니다. 올바른 형식은 다음과 같습니다.if condition; then do something; fi
- for 루프에서도 마찬가지 입니다 .
for
올바른 구문은 다음과 같습니다.for loop-specification; do something; done
- 명령 은 없습니다
print
(어쨌든 bash에 내장되어 있지 않음). 단지printf
및echo
; - 당신은해야항상 변수를 인용하세요.그렇게 하지 않을 타당한 이유가 없다면 말이죠.
따라서 스크립트의 약간 개선된 작업 버전은 다음과 같습니다.
#!/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
. 마찬가지로 조건은 종료에 의해 종료되는 것이 아니라 종료에 의해 종료됩니다.done
end
if
fi
end
이것은 Bourne/POSIX 쉘 구문 계열입니다. 다른 쉘에는 실제로 이 두 가지로 끝나는 것이 있을 수 있지만 end
이는 bash
사실이 아닙니다.
답변3
words = wc -w > $file
여기 등장인물들은 >
어울리지 않는 것 같아요. 그것이 없으면 줄 수를 계산하게 되지만 $file
현재로서는 stdin의 줄 수를 계산하고 결과를 $file
.