Bash在字符串列表中查找字符串位置

时间:2017-12-12 09:30:21

标签: bash shell

实现以下目标的最佳途径是什么?

我希望我的脚本找出其运行的主机位于主机列表中的位置。

thisHost=$(hostname)

machineList="pc02 server03 host01 server05"

所以如果thisHost=host01我会回到位置3.

机器列表永远不会包含超过10个项目。

我可以在for循环中进行比较匹配,但想知道是否有更好的方法?

4 个答案:

答案 0 :(得分:4)

如果需要检查多个主机,可以为更快的查找准备更好的结构:关联数组:

#! /bin/bash
machineList='pc02 server03 host01 server05'
declare -A machine_number
i=1
for machine in $machineList ; do
    machine_number[$machine]=$((i++))
done

thisHost=host01
echo ${machine_number[$thisHost]}

您还可以使用外部工具:

read n _rest < <(echo "$machineList"
                 | tr ' ' '\n'
                 | nl
                 | grep -Fw "$thisHost")
echo $n

答案 1 :(得分:1)

Bash 解决方案:

thisHost="host01"
machineList="pc02 server03 host01 server05"
machineListArr=($machineList)

for i in "${!machineListArr[@]}"; do 
    [ "$thisHost" = "${machineListArr[$i]}" ] && echo "position: $((i+1))"
done

输出:

position: 3

答案 2 :(得分:1)

Awk 单行解决方案:

thisHost="host01"
machineList="pc02 server03 host01 server05"

awk -v RS=" " -v h="$thisHost" '$0==h{ print NR }' <<<"$machineList"

输出:

3

答案 3 :(得分:1)

(1)便宜的单线:

    host='host01'
    machineList="pc02 server03 host01 server05"

    wc -w <<< ${machineList/%${host}*/dummy}

使用$host替换dummy开头的列表的其余部分,并使用wc计算单词。

(2)Pure Bash:

    host='host01'
    machineList="pc02 server03 host01 server05"

    shortList=( ${machineList/%${host}*/dummy} )
    echo  ${#shortList[@]}

如上所示缩短列表并返回数组shortList的元素数。

两种解决方案的输出均为3。