2012-08-03 109 views
1

我有一個數組已創建,我想查找一個關鍵字,然後如果找到,顯示它後面有n個元素的元素。這可能與bash有關,如果是這樣,有人可以提供一個例子嗎?操作的實施例 :基於條件的數組中的顯示元素

element 1=red 
element 2=blue 
element 3=green 

解析通過陣列,如果你看到的「綠色」,顯示爲2背後的元件。在這種情況下,它會返回「紅色」。

回答

0
#!/bin/sh 

val="blue" 
offset=2 #offset index when echoing 
array=("red" "green" "blue" "purple" "blue") 

for i in $(seq $offset $[${#array[*]}-1]) 
do 
    if [ "${array[$i]}" == "$val" ] 
    then 
    echo "${array[$[$i-$offset]]}" 
    fi 
done 

所有簡單的artihmetics可以在$[...];不要忘記變量名稱前的$。在處理bash中的數組時非常有用。請注意for循環開始時的偏移量,避免對負指標進行無用的測試。

+0

你能解釋偏移量嗎?這是否意味着所需價值的+2?你也可以使用負數嗎? – user1573041 2012-08-04 09:34:59

+0

偏移量是當前元素和顯示元素之間的元素數量(如您的示例中所示)。對於負偏移量,它可以在seq指令中進行修改:'$(seq 0 $ [$ {#array [*]} - 1- $ offset])''。其他地方不需要修改。爲了使它與正值和負值一起工作,我建議你在for循環之前計算seq指令的邊界,具體取決於偏移量的符號,然後用'for in in $(seq $)開始for循環開始$結束)' – Bentoy13 2012-08-07 14:49:24

1
#!/usr/bin/env bash 

val="blue" 
array=("red" "green" "blue") 

for ((i = 0; i < ${#array[@]}; i++)); do 
    if [[ $val == ${array[i]} ]] && ((i - 2 >= 0 )); then 
    echo "${array[i - 2]}" 
    fi 
done 

輸出:

red 

由於@jordanm在評論中指出的那樣,你就不需要擔心,如果數組索引還沒有確定會發生什麼事情。

+0

數組的內部[']'(我不記得適當的詞),已經是數字上下文了。 '「$ {array [i + 2]}」'將起作用。我向上投票是因爲這是一個足夠好的例子來讓OP開始,但還有其他一些問題需要考慮,例如數組稀疏,如果'i + 2'或'i-2'擴展爲null,該怎麼辦。 – jordanm 2012-08-03 04:46:59

+1

@jordanm:「下標」?我同意,它應該是基於OP使用「後面」一詞的'i - 2'。此外,否定的下標會在4.2之前的Bash版本中導致錯誤。 – 2012-08-03 07:24:09

+0

@jordanm查看我的編輯。 – 2012-08-03 13:57:13