Bash按args选择数组元素的位置

时间:2010-12-08 09:52:18

标签: bash

我想通过给出一个arg来制作一个返回元素数组位置的bash脚本。 请参阅下面的代码,我使用

#!/bin/bash
args=("$@")
echo ${args[0]}
test_array=('AA' 'BB' 'CC' 'DD' 'EE')
echo $test_array
elem_array=${#test_array[@]}
for args in $test_array
do
        echo 
done

最终我的输出应该是:

$script.sh DD
4

4 个答案:

答案 0 :(得分:6)

#!/bin/bash

A=(AA BB CC DD EE)

for i in "${!A[@]}"; do
        if [[ "${A[i]}" = "$1" ]]; then
                echo "$i"
        fi
done

注意"${!A[@]}"表示法,它给出了数组中有效索引的列表。通常,您不能只从0到"${#A[@]}" - 1,因为索引不一定是连续的。如果数组元素分配中存在间隙或者某些元素未被设置,则索引范围可能存在间隙。

上面的脚本将输出数组的所有索引,其内容等于脚本的第一个命令行参数。

修改

在您的问题中,您似乎希望将结果作为基于一个数组的索引。在这种情况下,您可以将结果增加一个:

#!/bin/bash

A=(AA BB CC DD EE)

for i in "${!A[@]}"; do
        if [[ "${A[i]}" = "$1" ]]; then
                let i++;

                echo "$i"
        fi
done

请记住,在与基于零的数组一起使用之前,此索引必须递减

答案 1 :(得分:1)

循环遍历阵列并跟踪位置。 当您找到与输入参数匹配的元素时,打印出元素的位置。您需要在该位置添加一个,因为数组具有从零开始的索引。

#! /bin/sh
arg=$1
echo $arg
test_array=('AA' 'BB' 'CC' 'DD' 'EE')
element_count=${#test_array[@]}
index=0

while [ $index -lt $element_count ]
do    
  if [ "${test_array[index]}" = "$arg" ]
  then
     echo $((index+1))
     break
  fi
  ((index++))
done

答案 2 :(得分:1)

没有循环:

#!/bin/bash

index() {
    local IFS=$'\n';
    echo "${*:2}" | awk '$0 == "'"${1//\"/\\\"}"'" { print NR-1; exit; }'
}

array=("D A D" "A D" bBb "D WW" D "\" D \"" e1e " D " E1E D AA "" BB)
element=${array[5]}
index "$element" "${array[@]}"

输出:

5

答案 3 :(得分:1)

尽量避免使用复杂的工具:

test_array=('AA' 'BB' 'CC' 'D D' 'EE')
OLD_IFS="$IFS"
IFS="
"
element=$(grep -n '^D D$' <<< "${test_array[*]}" | cut -d ":" -f 1)
IFS="$OLD_IFS"
echo $element

然而,它消耗了2个进程。如果我们允许自己sed,我们可以通过一个过程来完成:

test_array=('AA' 'BB' 'CC' 'D D' 'EE')
OLD_IFS="$IFS"
IFS="
"
element=$(sed -n -e '/^D D$/=' <<< "${test_array[*]}")
IFS="$OLD_IFS"
echo $element

<强>更新

正如thkala在评论中所指出的,这种解决方案在3个案例中被打破。如果出现以下情况,请注意不要使用它:

  1. 您想要零索引偏移。
  2. 您的数组元素中有换行符。
  3. 你有一个稀疏数组,或者有其他键而不是整数。