Bash允许使用:cat<(echo“$ FILECONTENT”) Bash也允许使用:while read i; do echo $ i; done< / etc / passwd 结合前两个这可以使用:echo $ FILECONTENT |而读i; do echo $ i;完成 最后一个问题是它创建子shell,并且在while循环结束变量后,我不能再访问。 我的问题是: 如何实现这样的事情:while read i; do echo $ i; done<(echo“$ FILECONTENT”)或换句话说:我怎么能确定我生存循环? 请注意,我知道封装while语句到{}但这不解决问题(想象你想使用函数中的while循环并返回i变量)
@H_502_4@
Process Substitution的正确表示法是:
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分组操作,而不是自己创建一个子shell。在这种情况下,它们是流水线的一部分,因此作为子shell运行,但它是因为|,而不是{…}。你在问题中提到这一点。 AFAIK,你可以在这些内部的函数中做一个返回。
Bash还提供了shopt
内置和其许多选项之一是:
lastpipe
If set,and job control is not active,the shell runs the last command of a pipeline not executed in the background in the current shell environment.
因此,在脚本中使用类似这样的东西使得修改的和在循环之后可用:
FILECONTENT="12 Name 13 Number 14 Information" shopt -s lastpipe # Comment this out to see the alternative behavIoUr sum=0 echo "$FILECONTENT" | while read number name; do ((sum+=$number)); done echo $sum
在命令行执行此操作通常会运行“作业控制不活动”的错误(即,在命令行,作业控制处于活动状态)。在不使用脚本的情况下测试此操作失败。
此外,正如Gareth Rees在他的answer中所指出的,你有时可以使用here string:
while read i; do echo $i; done <<< "$FILECONTENT"
这不需要shopt;您可以使用它来保存进程。