在bash中查找列表中元素的位置

时间:2015-06-11 02:55:25

标签: bash

我正在使用bash。我需要在列表中找到给定元素的位置。

我搜索了解决方案,但他们只检查列表中是否存在元素而不是查找索引。

#!/bin/bash

LIST=(A B C D)

# index_of_A = LIST.index('A') # which should return 0

echo ${LIST[${index_of_A}]} # prints 'A'

或者通过bash无法做到这一点?

编辑:删除破折号

2 个答案:

答案 0 :(得分:3)

首先,让我们定义清单:

list=(A B C D)

接下来,让我们定义一个函数来查找元素索引:

indexof() { i=0; while [ "$i" -lt "${#list[@]}" ] && [ "${list[$i]}" != "$1" ]; do ((i++)); done; echo $i; }

现在,很容易找到数组list的元素索引:

$ indexof "A"
0
$ indexof "C"
2

如果我们要求一个不在list中的元素的索引,我们得到的数字比数组中最大的索引多一个:

$ indexof "E"
4

替代

根据您的编程背景,您可能希望将未知元素的索引返回为-1。在那种情况下:

indexof() { i=-1; for ((j=0;j<${#list[@]};j++)); do [ "${list[$j]}" = "$1" ] && { i=$j; break; } done; echo $i; }

例如:

$ indexof "A"
0
$ indexof "B"
1
$ indexof "E"
-1

答案 1 :(得分:1)

如果你坚持聪明/低效/尴尬的方式:

#! /bin/bash

indexof()
{
    local word
    local item
    local idx

    word=$1
    shift
    item=$(printf '%s\n' "$@" | fgrep -nx "$word")
    let idx=${item%%:*}-1
    echo $idx
}

list=(A B C D)
indexof C "${list[@]}"    # 2
indexof Z "${list[@]}"    # -1

只要您的列表中的元素不包含换行符,就可以使用。