流程替换的正确表示法是:
while read i; do echo $i; done < <(echo "$FILECONTENT")
i
循环终止时,循环中的最后分配的值可用。一种替代方法是:
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
花括号是I / O分组操作,它们本身不会创建子外壳。在这种情况下,它们是管道的一部分,因此作为子外壳程序运行,但这是因为而|
不是{ ... }
。您在问题中提到了这一点。AFAIK,您可以在函数内部的这些函数中进行返回。
Bash还提供了shopt
内置函数,其众多选项之一是:
lastpipe
如果设置了该选项,并且作业控制未处于活动状态,则外壳程序会在当前外壳程序环境中运行不在后台执行的管道的最后一条命令。
因此,在脚本中使用类似这样的内容可使修改的内容sum
在循环后可用:
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
在命令行上执行此操作通常会导致“作业控制未激活”(即在命令行上作业控制处于活动状态)。不使用脚本进行测试失败。
另外,正如Gareth Rees在回答中指出的那样,有时您可以使用here字符串:
while read i; do echo $i; done <<< "$FILECONTENT"
这不需要shopt
; 您也许可以使用它来保存进程。