2017-12-12 30 views
1

以下を達成する最も良い方法は?Bashが文字列のリストに文字列を見つける

私のスクリプトは、実行しているホストがホストのリスト内にある場所を調べるようにします。

thisHost=$(hostname) 

machineList="pc02 server03 host01 server05" 

のでthisHost=host01場合、私はpostion 3

10件の以上のアイテムが含まれることはありませんでしょうマシンリスト取り戻すでしょう。

私はforループで比較一致を行うことができましたが、より良い方法があるかどうかを知りたいですか?

答えて

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 
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 
+0

ありがとう、私はリストが10台ほどしかないと言う質問を編集しました。 – AndyM

1

Awk一行溶液:

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

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

出力:

3 
1

(1)安価なワンライナー:

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

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

$hostで始まるリストの残りの部分をdummyに置き換えて、wcという単語を数えます。

(2)ピュアバッシュ:

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

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

上記のようにリストを短縮し、アレイshortListの要素の数を返します。

両方のソリューションで出力が3です。

関連する問題