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