以下のスクリプトを実行すると、正常な出力が得られます。ここで試すことは、以下にリストされているすべてのVMに接続する必要があり、スクリプトsshが次のように出力をwasadmds03
印刷するときにproduct detail
他のVMと同様にコマンドも実行する必要があることです。
"cat /source/package.json | grepバージョン"すべての仮想マシンで。
必要な出力を得ました。しかし、繰り返しの「if then」ステートメントを切り取る方法はありますか?私は "if then"ステートメントを4回使用しました。 50台の仮想マシンで同様の練習をしたい場合は、このプログラムをより短い方法で書く方法はありますか?
wasadmds03 - product detail
wasadmds04 - product list
wasadmls03 - Cart
wasadmls05 - checkout
- スクリプト
**
#!/bin/bash
for i in `cat /tmp/ms_test`
do
if [ $i = wasadmds03 ]
then
echo "Product Detail"
ssh $i "cat /source/package.json | grep version"
fi
if [ $i = wasadmds04 ]
then
echo "Product list"
ssh $i "cat /source/package.json | grep version"
fi
if [ $i = wasadmls03 ]
then
echo "Merchant"
ssh $i "cat /source/package.json | grep version"
fi
if [ $i = wasadmls05 ]
then
echo "Account Details"
ssh $i "cat /source/package.json | grep version"
fi
done
答え1
したがって、問題は、ファイルから読み取ったホスト名に基づいて特定のラベルを出力したいようです。
我々は間違いなくコードを少し圧縮することができます。各ホストで異なる必要があるテキストラベルを連想配列に保存すると、次のようになります。
printf '%s\n' "${labels[$remote]}"
ssh -n "$remote" 'cat /source/package.json' | jq -r .version
...ループ内で。
i
ここでは、ループ変数の名前をより説明的に自由に変更しましたremote
。私もprintf
代わりに使用していますecho
(」なぜprintfがechoより優れているのですか?jq
「)を使用する代わりに、実際のJSONパーサーを使用してJSONデータファイルを解析することを選択しましたgrep
。推測するversion
JSONデータには最上位キーがあります。
ssh
ssh -n
使用しているループ反復の入力を読み取らないように呼び出す必要があります。
配列labels
は次のように作成できます。
declare -A labels
labels=(
['wasadmds03']='Product Detail'
['wasadmds04']='Product List'
['wasadmls03']='Merchant'
['wasadmls05']='Account Details'
)
リモートホスト名が多い場合は、同様の方法でこの配列にリストする必要があります。このデータを他の方法で提供するわけではないので、各項目をリストする必要があります。
これは、リモートホスト名を正しく読み取ることで/tmp/ms_test
行われます("「IFS=read-r-line」を理解する")は次のスクリプトを提供します。
#!/bin/bash
declare -A labels
labels=(
['wasadmds03']='Product Detail'
['wasadmds04']='Product List'
['wasadmls03']='Merchant'
['wasadmls05']='Account Details'
)
while IFS= read -r remote; do
printf '%s\n' "${labels[$remote]}"
ssh -n "$remote" 'cat /source/package.json' | jq -r .version
done </tmp/ms_test