Bash

意外標記“完成”附近的語法錯誤 - 讀取行時

  • October 26, 2020

我不斷收到此錯誤:syntax error near unexpected token 'done'但我不明白為什麼。

我嘗試添加dos2unix *.shafter #!/bin/sh,但這只是給了我一個錯誤,除了“完成”錯誤之外沒有這樣的文件或目錄。

這是一個 .sh 文件。我對編寫腳本非常陌生。幫助?

我在跑

sh thisfile.sh program_input 輸入

在 Linux 上

編輯我在變數周圍添加了一些引號 - 同樣的錯誤

#!/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” 只是四行單詞,比如 “他們” “can” “fish” “they” “can” “take” “table”

如果我執行cat "$line" | program "$fst"它工作正常

請注意,如果我取出循環中的所有內容並僅 printf $line 它會給出相同的“完成”語法錯誤

syntax error near unexpected token 'done'是 Bash 在看到保留字之前done沒有匹配時給出的錯誤do。它與引號無關,但很可能與您的文件具有 DOS/Windows 樣式的 CRLF 行結尾有很大關係。shell將輸入符 (CR, \r) 視為正常字元,因此它看不到保留字do,而是看到do\r。另一方面,在最後一行它確實辨識done,因為它與行尾分開,並且 CR 與那個空格分開。

通過執行腳本文件本身dos2unix。不要腳本文件中添加dos2unix命令。

引用自:https://unix.stackexchange.com/questions/616504