2012-08-03 106 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