我想通过给出一个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
答案 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个案例中被打破。如果出现以下情况,请注意不要使用它: