줄을 읽는 동안 예상치 못한 토큰 '완료' 근처에 구문 오류가 발생했습니다.

줄을 읽는 동안 예상치 못한 토큰 '완료' 근처에 구문 오류가 발생했습니다.

이 오류가 계속 발생 syntax error near unexpected token 'done'하지만 이유를 이해할 수 없습니다.

dos2unix *.sh나중에 추가하려고 시도했지만 #!/bin/sh"완료" 오류 외에 해당 파일이나 디렉터리가 없다는 오류만 표시되었습니다.

이것은 .sh 파일입니다. 저는 스크립팅을 처음 접했습니다. 돕다?

나는 뛰고있어

sh thisfile.sh 프로그램 입력 입력

리눅스에서

편집하다변수 주위에 따옴표를 추가했습니다. 동일한 오류

#!/bin/sh
fst=$1
input=$2
while read line
do
    result=$(cat "$line" | program "$fst")
    if [ "$result" = "" ];
    then
        printf "$line\t=>\t *none* 0\n"
    else
        printf "$line\t=>\tyes\n"
    fi
done < "$input"

"$input"은 "they" "can" "fish" "they" "can" "take" "table"과 같은 단 네 줄의 단어입니다.

실행하면 cat "$line" | program "$fst"잘 되더라구요

노트루프의 모든 것을 꺼내고 printf $line만 사용하면 동일한 "완료" 구문 오류가 발생합니다.

답변1

syntax error near unexpected token 'done'doneBash가 예약어 앞에 일치하는 항목이 없을 때 발생하는 오류입니다 . do따옴표와는 아무 관련이 없지만 아마도 DOS/Windows 스타일 CRLF 줄 끝이 있는 파일과 많은 관련이 있을 것입니다. 쉘은 캐리지 리턴 문자(CR, \r)를 일반 문자로 처리하므로 예약어는 표시되지 않고 do대신 do\r표시됩니다. 반면 마지막 줄에서는 done줄 끝 부분과 구분되어 있고 CR도 그 공백으로 구분되어 있기 때문에 인식합니다.

스크립트 파일 자체를 실행합니다 dos2unix. 추가된 dos2unix명령 없음존재하다스크립트 파일.

답변2

나는 사용할 것이다

#!/bin/sh
program_input="$1"
input="$2"
cat "$input" | while read line
do
    result=$(echo "$line" | program -sli "$program_input")
    if [ "$result" = "" ] 
    then
        printf "$line\t=>\t *none* 0\n"
    else
        printf "$line\t=>\tyes\n"
    fi
done
  • result=$( ... )결과보다 좋음= ...(백틱)

주문하다

echo -e `"$line"\t=>\tyes`

방법:

  • 구현하다"$line"\t=>\tyes
  • "$line" =출력을 다음으로 리디렉션yes
  • (결과는 비어 있어야 하며 echo -e whatever result, stdout은 yes로 캡처되거나 stderr은 캡처되지 않습니다.)

너가 원하는게 그거야?

순수주의자들은 고양이를 쓸모없게 사용하는 것에 반대할 수도 있습니다.

cat "$input" | while read file
do

done

로 대체될 수 있다

while read file
do

done < "$input"

그러나 while 루프에 너무 많은 줄이 있으면 while이 무엇을 읽고 있는지 추측하기가 쉽지 않을 수 있습니다.

관련 정보