在循环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'while read'循环中设置的变量在它之后未设置[重复]