加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 09:24:59 所属栏目:安全 来源:网络整理
导读:Bash允许使用:cat(echo“$ FILECONTENT”) Bash也允许使用:while read i; do echo $ i; done / etc / passwd 结合前两个这可以使用:echo $ FILECONTENT |而读i; do echo $ i;完成 最后一个问题是它创建子shell,并且在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;您可以使用它来保存进程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读