在循环linux bash之外获取变量[重复]

Posted

技术标签:

【中文标题】在循环linux bash之外获取变量[重复]【英文标题】:getting variable outside loop linux bash [duplicate] 【发布时间】:2018-12-07 13:28:04 【问题描述】:

我想要一串我所有的 HomePod id。我可以循环一个名为 player.json 的文件:

homepods=""
jq -r '.data.players[]|select(.type == "airplay" and .is_multiple == false)|.id' players.json | while read homepod; do
    homepods+="$homepod,"
done

echo $homepods

我希望结果是 id,id,id,但 $homepods 是空的。当我在循环内回显 $homepods 时,输出符合预期。

【问题讨论】:

可以添加示例输入文件吗? players.json 你的意思是?这不是问题,jq 循环有效。当我回显 $homepod 和/或 $homepods 时,会显示这些值。 【参考方案1】:

管道在具有父进程环境副本的新环境中启动新进程,因此它不能更改父变量。

因此,您需要另一种方法:

homepods=$( 
    printf "%s," $(
    jq -r '.data.players[]|select(.type == "airplay" and .is_multiple == false)|.id' players.json
))

在这种情况下,父级正在捕获子级的输出。

或者:

homepods=$(
  jq -r '.data.players[]|select(.type == "airplay" and .is_multiple == false)|.id' players.json | while read homepod; do
    echo "$homepod,"
  done)

回答您的附加请求:您还可以回显计数器,然后将其从捕获的输出中拆分出来。但是,还有一个更简单的选择:

homepods_array=($homepods//,/ )
homepods_count=$#homepods_array[@]

这就是将字符串转换为bash array,然后恢复数组的长度。这也是使用 bash 字符串操作来替换空格的逗号。

顺便说一句,使用字符串操作,您可以获得多种格式的 id,根本没有循环:

homepods_lines=$(jq -r '.data.players[]|select(.type == "airplay" and .is_multiple == false)|.id' players.json)
homepods_spaces=$homepods_lines//$'\n'/ 
homepods_commas=$homepods_lines//$'\n'/,
homepods_array=(homepods_lines)
homepods_count=$#homepods_array[@]

【讨论】:

太好了,这行得通。但是如果我想创建第二个变量呢?我希望在循环时创建 2 个变量 1)包含 ID 的 homepod 和 2)一个变量,它是 5、5、5 等……基于 player.json 的结果数 您介意添加一个示例吗?我的 Linux 脚本技能还不如 php :) 这些够了吗? 谢谢,我也试试看。【参考方案2】:

您可以使用以下脚本:-

homepods=""
for homepod in `jq -r '.data.players[]|select(.type == "airplay" and .is_multiple == false)|.id' players.json` ; do
    homepods+="$homepod,";
done

echo $homepods

【讨论】:

以上是关于在循环linux bash之外获取变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash for循环中使用变量[重复]

在bash'while read'循环中设置的变量在它之后未设置[重复]

While循环重置Bash脚本中的数字变量[重复]

[Linux Shell学习系列七]Bash循环——1for循环

for循环子命令中的bash变量扩展[重复]

Bash shell在while循环后“清除”一个变量,如何获取变量内文件夹中的所有文件? [复制]