在shellcript

时间:2016-12-25 10:37:00

标签: arrays bash

我尝试从git用户获取所有repos并将它们放入shell脚本中的数组中。不知何故,数组不会将新行识别为分隔符,并且在数组中只有一个多行元素。

这是我的示例代码:

someUser=Joe
declare -a repos=$(curl -s "https://api.github.com/users/$someUser/repos?page=$PAGE&per_page=100" | grep -e 'git_url*' | cut -d \" -f 4 | cut -d"/" -f5 | cut -d"." -f1)

for repo in $repos; do
  echo $repo
  // some more stuff
done

卷曲和剪裁的输出看起来像是:

RepoA
RepoB
RepoC
[...]

如何将新的线元素视为数组中的新元素?我多次使用该数组,因此我需要一个带有所有存储库的固定容器。

2 个答案:

答案 0 :(得分:2)

这是迭代Bash数组元素的正确方法:

for repo in "${repos[@]}"; do

另外,要创建一个带有命令输出的数组,您需要将$(...)子shell包装在(...)中,如下所示:

declare -a repos=($(curl -s ...))

答案 1 :(得分:0)

感谢@janos我修复了脚本。 delcare系列中的附加支架是问题所在。这是完整的代码。也许有人想复制它。

#!/bin/bash

gitUrl="https://github.com"
gitUser="foobar"
cloneCmd="git clone"
fetchCmd="git fetch"

magenta="\033[35m"
green="\033[32m"
def="\033[0m"

declare -a repos=($(curl -s "https://api.github.com/users/$gitUser/repos?page=$PAGE&per_page=100" | grep -e 'git_url*' | cut -d \" -f 4 | cut -d"/" -f5 | cut -d"." -f1))

# Init clone
echo -e "$magenta Cloning new Repositories $def"
for repo in "${repos[@]}"
do
    if [ -d $repo ]; then
        echo -e "$green \tRepo $repo already exists $def"
        continue
    fi

    $cloneCmd $gitUrl/$gitUser/$repo

done
echo -e "$green Colning finished $def"

# Update Repos
echo -e "$magenta Updating Repositories $def"
for repo in "${repos[@]}"
do
    cd $repo
    $fetchCmd
    cd ..
done
echo -e "$green Update finished $def"