【问题标题】:getting variable outside loop linux bash [duplicate]在循环linux bash之外获取变量[重复]
【发布时间】: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 时,会显示这些值。

标签: linux bash


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 2012-06-01
    • 2020-04-05
    • 2017-09-30
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2017-11-04
    相关资源
    最近更新 更多