Ich schreibe ein Bash-Skript, um rsync zu verwenden und Dateien auf etwa 20 verschiedenen Servern zu aktualisieren.
Ich habe den Rsync-Teil herausgefunden. Ich habe Probleme damit, eine Liste von Variablen durchzugehen.
Mein Skript sieht bisher so aus:
#!/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
Wo [Server IP Address]
soll der Wert der zugehörigen Variablen sein. Wenn also i = 1 ist, sollte ich den Wert von $ SERVER1 ausgeben.
Ich habe mehrere Iterationen davon ausprobiert, einschließlich
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
Es ist lange her, dass ich Skripte geschrieben habe, also weiß ich, dass mir etwas fehlt. Außerdem bin ich mir sicher, dass ich mit C # mische, was ich in den letzten 11 Jahren verwendet habe.
Ist das, was ich versuche, überhaupt möglich? Oder sollte ich diese Werte in ein Array einfügen und das Array in einer Schleife durchlaufen? Ich brauche das gleiche für Produktions-IP-Adressen sowie Standortnamen.
Dies ist alles in dem Bemühen, nicht einen Codeblock wiederholen zu müssen, den ich zum Synchronisieren der Dateien auf dem Remote-Server verwenden werde.
quelle
Antworten:
Verwenden Sie ein Array.
quelle
Wie die anderen Antworten zeigen, ist ein Array der bequemste Weg, dies zu tun. Der Vollständigkeit halber fragen Sie jedoch genau nach einer indirekten Erweiterung . Wie folgt umgeschrieben, funktioniert Ihr Beispiel auch mit dieser Methode:
Wenn Sie nur die Liste der IP-Adressen in die
for
Schleife einfügen möchten, können Sie auch einige geschweifte Klammern verwenden, um alles zu durchlaufen, was Sie benötigen:Wenn Sie die (möglicherweise geschweifte) Liste jedoch wiederverwenden müssen, ist die Verwendung der Liste zum Initialisieren eines Arrays der richtige Weg:
quelle
Während ich wahrscheinlich selbst mit einer der Array-Antworten gehen würde, möchte ich darauf hinweisen, dass es möglich ist, Namen direkt zu durchlaufen. Du kannst tun
oder ab 4.3 können Sie Folgendes verwenden
nameref
:Hutspitze ilkkachu für die <4,3 Lösung.
quelle
${!var}
) funktioniert auch mit älteren Versionen von Bash:foo1=aa; foo2=bbb; foox=cccc; for p in "${!foo@}"; do echo "$p = ${!p}"; done
Jeder, der sagte, Sie sollten ein Array verwenden, ist richtig, aber - als akademische Übung - wenn Sie entschlossen wären, dies mit separaten Variablen zu tun, die mit einer Zahl enden (SERVER1, SERVER2 usw.), würden Sie dies tun es:
quelle
eval
ist schwer sicher zu bedienen. Ja, das kann funktionieren, aber eine indirekte Erweiterung ist im Allgemeinen besser.eval
geschieht, haben Sieecho $SERVER1
nichtecho "$SERVER1"
. Ja sicher zu bedienen, aber sehr einfach unsicher zu bedienen oder nicht so, wie Sie es beabsichtigt haben!