예상되는 "fi"는 예상치 못한 것입니까?

예상되는 "fi"는 예상치 못한 것입니까?

파일 크기가 9999바이트 미만인지 확인해 보려고 하는데 여기서 왜 깨지는지 모르겠습니다.

if compgen -G "$jdir0/"*.srt 
then

for f in "$jdir0"/*.srt
do
    jsubtitle="$(basename $f)"
    filesize=$(du -b "$jdir0/$jsubtitle" | cut -f1)
        if [ "$filesize" -lt 9999 ] then
           echo "less"
        fi   #line 443
        if [ $filesize -gt 10000 ] then......etc,etc...



    **line 443: syntax error near unexpected token `fi'**

$filesize 변수를 확인했는데 공백 없이 숫자만 포함되어 있습니다. 또한 if 문에서 변수 $filesize(및 9999) 주위에 ""가 없도록 시도했습니다. 나는 또한 double [[을 테스트했지만 아무것도 테스트하지 않았습니다.

이 is 문은 "for f in.." 루프 내의 다른 if 문 안에 있지만 이것이 영향을 미쳐서는 안 됩니까?

답변1

내 생각에 당신의 문제는 당신이 then조건과 같은 선상에 있다는 것입니다. 다음 줄에 있거나 세미콜론이 앞에 와야 합니다.

해결책: if [ "$filesize" -lt 9999 ]; then

답변2

if 문은 then한 줄에 있거나 앞에 다음이 와야 합니다 ;.

    if [ "$filesize" -lt 9999 ]; then
       echo "less"
    fi

답변3

존재하다:

if [ "$filesize" -lt 9999 ] then
           echo "less"
fi

목록을 끝내는 키워드 가 아닌 then명령에 추가 인수로 전달됩니다 .[then조건부 명령내부에:

if
   condition-commands
then
   then-commands
〚elif
   more-condition-commands
then
   more-then-commands〛
〚else
   else-commands〛
fi

성명.

[이 명령을 다음과 같이 덜 특이한 이름을 가진 다른 간단한 명령으로 바꾸면 더 분명해집니다 echo.

if echo whatever then
  echo "less"
fi

then쉘이 echo또는 같은 간단한 명령에 대한 인수에서 키워드를 키워드로 처리하지 않더라도 키워드를 식별하는 stackexchange의 구문 강조에 속지 마십시오 [. 다음 상황에서도 동일한 작업이 수행된다는 것을 알 수 있습니다.

echo then
[ then = alors ]

첫 번째 것이 fi필요하기 때문에 이것은 예상치 못한 일입니다. then이는 then어떤 방식으로든 정의되어야 합니다. 그래서:

if [ "$filesize" -lt 9999 ]; then
   echo "less"
fi

또는:

if [ "$filesize" -lt 9999 ]
then echo "less"
fi

기술적으로 말하자면,

if [ "$filesize" -lt 9999 ] & then
   echo "less"
fi
if ([ "$filesize" -lt 9999 ]) then
   echo "less"
fi

구문론적 관점에서도 작동 bash하지만 동일하지는 않습니다. 첫 번째는 [백그라운드에서 명령을 실행하고(백그라운드에서 성공적으로 시작되었는지 테스트하는 중입니다), 두 번째는 하위 쉘에서 명령을 실행합니다.

관련 정보