使用while和grep组合-"syntax error near unexpected token `<'"

3
我试图在 while 循环中将 grep 的 stdout 重定向到 read 命令的 stdin。下面的代码给了我语法错误 - "syntax error near unexpected token `<' "
提示:< 是一个 HTML 转义字符,实际上是 "<" 字符的转义形式。
while read -r line ; do
 echo "Processing $line "
 IFS=: read var1 var2 var3 <<< $line
 if [ -n "$(expr match "$var3" '.*\(BEGIN\).*')" ]; then
   echo "Found BEGIN"
   (( var2 += 1 ))
   read -r line1
   IFS=: read var4 var5 var6 <<< $line1
   if [ -n "$(expr match "$var6" '.*\(END\).*')" ]; then
     echo "Found END"
     (( var5 -= 1 ))
     sed -i -e "$var2,$var5 s/# //" -e "$var2,$var5 s%/\* %%" -e "$var2,$var5 s% \*/%%" $var1
   fi
 else
   echo "Found NOTHING"
   sed -i -e "$var2 s%// %%" $var1
 fi
done < <(grep -H -r -n Uncomment *)

3
在寻求人类的帮助之前,您应该将您的代码通过 shellcheck.net 并修复它所识别出来的错误(这些错误可能会很多)。 - John1024
3
我理解您在使用sh而不是bash运行脚本时遇到了相应的错误。我会尽力保持翻译的准确性和可读性,但不会改变原意或添加任何额外内容。 - rrauenza
1
虽然,一个展示静态检查的工具的例子应该有一些糟糕的代码。否则,它怎么展示它的功能呢? :) - Charles Duffy
1
这与OP的问题无关了,但是shellcheck的例子是故意写得很糟糕。 - Will Barnwell
1
@MarcB,那些是here字符串,而不是here文档;在ksh或其精神派生物(包括bash)中,语法是正确的。 - Charles Duffy
显示剩余8条评论
2个回答

5
< <(...) 语法仅适用于具有 ksh 扩展的Shell,例如 ksh 自身或者 bash。当我在 sh 中运行您的代码时,我得到了完全相同的错误。
请更新(或添加!)shebang 为 #!/bin/ksh#!/bin/bash

在一些非常流行的系统中(包括 MacOS),可能是/bin/ksh/bin/bash。当不确定时,使用#!/usr/bin/env bash可能不是一个坏主意。 - Charles Duffy
是的,现在大多数Linux发行版都将/bin符号链接到/usr/bin了。 - rrauenza
谢谢,我也因同样的问题而来到这里,现在已经解决了。 - apines

1
使用bash shebang可以解决此问题。将#!/bin/bash (或适当的bash位置#!/usr/bin/env bash)放置在文件的第一行。
如果您需要在sh中执行此操作,也可以将您的< <()更改为<<< "$()",它将子shell的结果作为字符串输入,我刚刚测试了这个方法,它可以在bashsh中运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接