我不断收到此错误:syntax error near unexpected token 'done'
但我不明白为什么。
我尝试添加dos2unix *.sh
after #!/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 正在读取什么。