2013-06-11 24 views
3

搜索已經讀入文件的數組(lines_ary [@]),我試圖在文本中查找版本號。在這裏我正在尋找Release,所以我可以找到以下版本號。循環播放一個Bash數組:獲取循環中間的下一個元素

有沒有辦法在執行下面的循環時訪問bash腳本中數組中的下一個元素?

for i in ${lines_ary[@]}; do 
if [ $i == "Release:" ] ; then 
    echo ${i+1} 
fi 
done 

這只是打印出'1',而不是'4.4'。

+0

僅供參考'$ {I + 1}'如果說'我要打印的'$ i'值'未設置(即,打印一個空字符串),但在加號後打印單詞(在本例中爲「1」)。加號是使用替代值運算符。 – chepner

回答

2

這個輸出 「4.4」:

array=("line 1" "Release: 4.4" "line 3") 
# loop over the array indices 
for i in "${!array[@]}"; do 
    if [[ ${array[i]} =~ Release:\ (.+) ]]; then 
     echo ${BASH_REMATCH[1]} # the text in the capturing parentheses 
     break 
    fi 
done 
+0

完美!謝謝。 – kjbradley

7

您需要循環上指數數組,而不是數組本身的元素在:

for ((index=0; index <= ${#lines_ary[@]}; index++)); do 
    if [ "${lines_ary[index]}" == "Release:" ]; then 
    echo "${lines_ary[index+1]}" 
    fi 
done 

使用for x in ${array[@]}環比元素,而不是在它的索引。使用變量名稱i不是一個好主意,因爲i通常用於索引。

+0

我很感激快速的迴應。該行包含「Release:」+「4.4」,因此它們被認爲是此代碼中的一個元素。有什麼想法嗎? – kjbradley

1

這應該工作:

for ((index=0; index < ${#lines_ary[@]}; index++)); do 
    line=${lines_ary[index]} 
    if [[ ${line} =~ ^.*Release:.*$ ]]; then 
    release=${line#*Release: *} 
    fi 
done 
相關問題