私は約20の異なるサーバーでrsyncファイルとアップデートファイルを使用するためのbashスクリプトを書いています。
rsync部分を見つけました。私が経験している問題は、変数のリストを調べることです。
これまで私のスクリプトは次のようになりました。
#!/bin/bash
SERVER1="192.xxx.xxx.2"
SERVER2="192.xxx.xxx.3"
SERVER3="192.xxx.xxx.4"
SERVER4="192.xxx.xxx.5"
SERVER5="192.xxx.xxx.6"
SERVER6="192.xxx.xxx.7"
for ((i=1; i<7; i++))
do
echo [Server IP Address]
done
[Server IP Address]
関連する変数の値でなければなりません。したがって、i = 1の場合は$ SERVER1の値をエコーする必要があります。
私は以下を含むいくつかの繰り返しを試しました。
echo "$SERVER$i" # printed the value of i
echo "SERVER$i" # printer "SERVER" plus the value of i ex: SERVER 1 where i = 1
echo $("SERVER$i") # produced an error SERVER1: command not found where i = 1
echo $$SERVER$i # printed a four digit number followed by "SERVER" plus the value of i
echo \$$SERVER$i # printed "$" plus the value of i
台本を書いてから長い時間が過ぎたので、何か落ちたことがわかっています。また、私はC#ができることを混ぜていると確信しており、11年間C#を使用してきました。
私がしたいことが可能なことですか?それとも、値を配列に入れて配列を繰り返す必要がありますか?本番 IP アドレスとロケーション名にも同じことが必要です。
これは、リモートサーバーでファイルを同期するために使用するコードブロックを繰り返す必要がないことです。
答え1
配列を使用してください。
#! /bin/bash
servers=( 192.xxx.xxx.2 192.xxx.xxx.3
192.xxx.xxx.4 192.xxx.xxx.5
192.xxx.xxx.6 192.xxx.xxx.7
)
for server in "${servers[@]}" ; do
echo "$server"
done
答え2
他の答えで指摘したように、配列はこれを行う最も便利な方法です。しかし、完全性を期すために正確にあなたが要求するもの間接拡張。次のように書き直すと、このアプローチを使用しても例は機能します。
#!/bin/bash
SERVER1="192.xxx.xxx.2"
SERVER2="192.xxx.xxx.3"
SERVER3="192.xxx.xxx.4"
SERVER4="192.xxx.xxx.5"
SERVER5="192.xxx.xxx.6"
SERVER6="192.xxx.xxx.7"
for ((i=1; i<7; i++))
do
servervar="SERVER$i"
echo "${!servervar}"
done
IPアドレスのリストをループに入れるのが大丈夫な場合はfor
、必要なものを繰り返すために中括弧拡張を使用することを検討することもできます。
#!/bin/bash
for server in \
192.xxx.xxx.{2..7} \
192.yyy.yyy.{42..50} \
192.zzz.zzz.254
do
echo "$server"
done
ただし、(中括弧拡張可能)リストを再利用する必要がある場合は、リストを使用して配列を初期化するのが正しい方法です。
#!/bin/bash
servers=(
192.xxx.xxx.{2..7}
192.yyy.yyy.{42..50}
192.zzz.zzz.254 )
for server in "${servers[@]}"
do
echo "$server"
done
答え3
おそらく配列の答えの1つを選択したいのですが、名前を直接繰り返すこともできることを指摘したいと思います。あなたはできます
for name in "${!SERVER*}"; do
echo "${!name}"
done
または4.3以降では、次のものを使用できますnameref
。
declare -n name
for name in "${!SERVER*}"; do
echo "$name"
done
帽子のヒントイルカチョ< 4.3のソリューション。
答え4
配列を使用する必要があると言う人はすべて正しいです。ただし、学術練習で数字で終わる別の変数(SERVER1、SERVER2など)を使用して配列を使用することにした場合は、次のようにします。
for ((i=1; i<7; i++))
do
eval echo \"\$SERVER$i\"
done