J'écris un script bash pour utiliser rsync et mettre à jour des fichiers sur environ 20 serveurs différents.
J'ai compris la partie rsync. Ce qui me pose problème, c'est de parcourir une liste de variables.
Jusqu'à présent, mon script ressemble à ceci:
#!/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
Où [Server IP Address]
devrait être la valeur de la variable associée. Donc, quand i = 1, je devrais faire écho à la valeur de $ SERVER1.
J'ai essayé plusieurs itérations de cela, y compris
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
Cela fait longtemps que je n'ai pas scénarisé, donc je sais que je manque quelque chose. De plus, je suis sûr que je mixe ce que je pourrais faire en utilisant C #, que j'utilise depuis 11 ans.
Ce que j'essaie de faire est-il même possible? Ou devrais-je mettre ces valeurs dans un tableau et boucler à travers le tableau? J'ai besoin de cette même chose pour les adresses IP de production ainsi que les noms d'emplacement.
Tout cela dans un effort pour ne pas avoir à répéter un bloc de code que j'utiliserai pour synchroniser les fichiers sur le serveur distant.
la source
Réponses:
Utilisez un tableau.
la source
Comme le soulignent les autres réponses, un tableau est le moyen le plus pratique de le faire. Cependant, pour être complet, la chose exacte que vous demandez est une expansion indirecte . Réécrit comme suit, votre échantillon fonctionnera également en utilisant cette méthode:
Si vous êtes d'accord avec simplement mettre la liste des adresses IP dans la
for
boucle, vous pouvez également envisager simplement d'utiliser des extensions d'accolade pour répéter tout ce dont vous avez besoin:Mais si vous avez besoin de réutiliser la liste (éventuellement agrandie), alors utiliser la liste pour initialiser un tableau serait le chemin à parcourir:
la source
Bien que j'irais probablement avec l'une des réponses du tableau moi-même, je voudrais souligner qu'il est possible de boucler directement sur les noms. Tu peux faire
ou, en 4.3 et plus, vous pouvez utiliser
nameref
:Pointe du chapeau ilkkachu pour la solution <4.3.
la source
${!var}
) fonctionne également avec les anciennes versions de Bash:foo1=aa; foo2=bbb; foox=cccc; for p in "${!foo@}"; do echo "$p = ${!p}"; done
Tous ceux qui ont dit que vous devriez utiliser un tableau sont corrects, mais - comme exercice académique - si vous étiez déterminé à le faire avec des variables distinctes se terminant par un nombre (SERVER1, SERVER2, etc.), c'est comme ça que vous feriez il:
la source
eval
est difficile à utiliser en toute sécurité. Oui, cela peut fonctionner, mais l'expansion indirecte bash est une meilleure façon en général.eval
terminé, vous l'avez faitecho $SERVER1
, nonecho "$SERVER1"
. Oui possible d'utiliser en toute sécurité, mais très facile à utiliser en toute sécurité ou pas comme vous le vouliez!