2016-12-25 41 views
2

我試圖從一個git用戶獲取所有的回購,並將它們放入一個shell腳本內的數組中。不知何故,陣列不會將新行識別爲分隔符,並且表現爲陣列中只有一個多行元素。解析多行輸出到shellcript中的數組

Here's我的示例代碼:

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

這是迭代一個擊數組的元素的正確方法:

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

此外,創建具有一個命令的輸出的陣列,需要內(...)包住$(...)子外殼,像這個:

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

感謝澄清,但我仍然得到一個錯誤的輸出:( 還有數組中的第一個元素是整個捲曲和減產。 [編輯] – Moka

+0

@Moka我在腳本中發現的另一個問題,現在修復它,看我更新的帖子 – janos

+0

謝謝@janos 第二個修復與額外的支架解決了我的問題。我會用完整的代碼回答這個問題:) – Moka

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" 
+0

你認真地認爲任何人都想使用你的腳本? 1.你用一種破碎的方式填充數組:使用'mapfile'或'read'來正確填充它。 2.您使用'grep'和'cut'鏈來解析json:破碎且效率低下。使用合適的解析器,例如'jq'。你把代碼放在變量中。代碼不是數據(這不是Lisp)。改用一個函數。 4.使用更多引號。 5.不要使用硬編碼的ANSI轉義序列。使用'tput'。我可能錯過了一些反模式':)'。 –

+0

好的:D我會盡力解決這些錯誤。我不專業,但謝謝你的想法。 – Moka