实现以下目标的最佳途径是什么?
我希望我的脚本找出其运行的主机位于主机列表中的位置。
thisHost=$(hostname)
machineList="pc02 server03 host01 server05"
所以如果thisHost=host01
我会回到位置3.
机器列表永远不会包含超过10个项目。
我可以在for循环中进行比较匹配,但想知道是否有更好的方法?
答案 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。