读取行时出现意外标记“done”附近的语法错误

读取行时出现意外标记“done”附近的语法错误

我不断收到此错误:syntax error near unexpected token 'done'但我不明白为什么。

我尝试添加dos2unix *.shafter #!/bin/sh,但这只是给了我一个错误,除了“完成”错误之外,还没有这样的文件或目录。

这是一个 .sh 文件。我对编写脚本很陌生。帮助?

我在跑

sh thisfile.sh 程序输入 输入

在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”只是四行单词,例如“they”“can”“fish”“they”“can”“take”“table”

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

笔记如果我取出循环中的所有内容并仅 printf $line 它会给出相同的“完成”语法错误

答案1

syntax error near unexpected token 'done'是 Bash 在看到保留字前面done没有匹配项时给出的错误。do它与引号无关,但很可能与具有 DOS/Windows 风格的 CRLF 行结尾的文件有很大关系。 shell将回车符 (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=$( ... )优于 result= ...(反引号)

命令

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

方法 :

  • 执行"$line"\t=>\tyes
  • 将输出重定向"$line" =yes
  • 并且echo -e whatever result(结果应该为空,stdout 被捕获到 yes 或 stderr 未被捕获)。

那是你要的吗 ?

纯粹主义者可能会反对无用地使用 cat 作为

cat "$input" | while read file
do

done

可以替换为

while read file
do

done < "$input"

但是,如果 while 循环的行数过多,则可能不容易猜测 while 正在读取什么。

相关内容