我正在使用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无法做到这一点?
编辑:删除破折号
答案 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
只要您的列表中的元素不包含换行符,就可以使用。