Bash – 如何管道输入到while循环和保留变量后循环结束

前端之家收集整理的这篇文章主要介绍了Bash – 如何管道输入到while循环和保留变量后循环结束前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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变量)
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;您可以使用它来保存进程。

原文链接:https://www.f2er.com/bash/390145.html

猜你在找的Bash相关文章