이 오류가 계속 발생 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'
done
Bash가 예약어 앞에 일치하는 항목이 없을 때 발생하는 오류입니다 . 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이 무엇을 읽고 있는지 추측하기가 쉽지 않을 수 있습니다.