Linux Bash脚本在使用Curl循环时读取问题

Linux Bash脚本在使用Curl循环时读取问题,linux,bash,shell,while-loop,Linux,Bash,Shell,While Loop,我不熟悉用bash编写脚本,在尝试从星球大战api访问数据时,我遇到了执行while read循环的问题。我的问题是,我正在尝试获取所有角色的名称以及所有相关星际飞船的名称(可以不止一个)。我下面的代码将获取角色的名称,然后获取要传递给航天器的url,并检索航天器的名称。问题是,当我试图将所有这些放在一起时,输出似乎覆盖了哪个人属于哪个航天器,而不是将每个人分配给该航天器。我希望以卢克·天行者为例: Luke Skywalker X-Wing Luke Skywalker Imperial Sh

我不熟悉用bash编写脚本,在尝试从星球大战api访问数据时,我遇到了执行while read循环的问题。我的问题是,我正在尝试获取所有角色的名称以及所有相关星际飞船的名称(可以不止一个)。我下面的代码将获取角色的名称,然后获取要传递给航天器的url,并检索航天器的名称。问题是,当我试图将所有这些放在一起时,输出似乎覆盖了哪个人属于哪个航天器,而不是将每个人分配给该航天器。我希望以卢克·天行者为例:

Luke Skywalker X-Wing
Luke Skywalker Imperial Shuttle
但是对于卢克·天行者来说,我得到的输出是空白的,因为随着代码在所有相关人员中的传播,X翼似乎连接到了另一个角色。任何指导都将不胜感激。 Bash Shell脚本:

#!/usr/bin/env bash

url='https://swapi.co/api'

n=1
while true
do
    response=$( curl -sL -H 'Accept: application/json' ${url}/people 
    page=${n} )
    if [[ ${response} =~ .*detail.*Not.* ]]; then
            break
    fi
    n=$((n + 1))
    name=$( echo ${response} | jq -r '.results[] | "\(.name)"' | tr -d '"')
    echo ${response} | jq -r '.results[] | { starships: .starships }' | 
    egrep /starships/ |\
    sed -e 's/^[ \t]*//' | tr -d '"' | tr -d ',' |\
            while read shipurl
            do
                    curl -s ${shipurl} | jq '.name' | tr -d '"'
            done |\
            while read shipname
            do
            echo  "${name}" " ${shipname}"
            done

done

谢谢

哦,孩子!这应该使用
python
。。。但是在这里,我试了一下。不是《星球大战》的铁杆粉丝,所以不知道结果是否合适,但这会给你更多的想法

注意,我已经为我的测试用例禁用了
,而为true
。我相信一些与jq相关的东西可以得到更多的清理。我对每艘
星际飞船使用
pilots
,并根据这一点进行匹配,因为每艘
字符名
都有多艘匹配的
星际飞船

$ cat crazystarwars.sh

#!/usr/bin/env bash

url='https://swapi.co/api'
n=1
#while true
#do
    response=$(curl -sL -H 'Accept: application/json' "${url}/people?page=${n}")
    if [[ ${response} =~ .*"detail".*"Not".* ]]; then
            break
    fi

    readarray -t name < <( echo "${response}" | jq -r '.results[] | "\(.name)"')
    readarray -t shipurls < <(echo ${response} | jq -r '.results[] | { starships: .starships }' | egrep /starships/ | sed -e 's/^[ \t]*//' | tr -d '"' | tr -d ',')

    for p in "${shipurls[@]}"
    do

        shipname=$(curl -s ${p} | jq '.name' | tr -d '"')
        readarray -t _pilots < <(curl -s ${p} | jq -r '.pilots[]' | xargs -I {} sh -c 'curl -s {}' | jq '.name')

        for _name in "${name[@]}"
        do
            if [[ "${_pilots[@]}" =~ "${_name}" ]]; 
            echo "${_name} ${shipname}"
            break
            fi
        done

    done
#   ((n++))
#done

这是一个疯狂的剧本!:)
$ ./crazystarwars.sh
Luke Skywalker X-wing
Luke Skywalker Imperial shuttle
Darth Vader TIE Advanced x1
Luke Skywalker X-wing
Obi-Wan Kenobi Jedi starfighter
Obi-Wan Kenobi Trade Federation cruiser
Obi-Wan Kenobi Naboo star skiff
Obi-Wan Kenobi Jedi Interceptor
Obi-Wan Kenobi Belbullab-22 starfighter