Piszę skrypt bash, aby używać rsync i aktualizować pliki na około 20 różnych serwerach.
Rozpracowałem część rsync. Mam problem z przeglądaniem listy zmiennych.
Mój skrypt do tej pory wygląda następująco:
#!/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
Gdzie [Server IP Address]
powinna być wartość powiązanej zmiennej. Więc kiedy i = 1 powinienem powtórzyć wartość $ SERVER1.
Próbowałem kilka iteracji w tym
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
Minęło dużo czasu, odkąd napisałem scenariusz, więc wiem, że czegoś mi brakuje. Poza tym jestem pewien, że mieszam to, co mogę zrobić, używając C #, którego używałem przez ostatnie 11 lat.
Czy to, co próbuję zrobić, jest w ogóle możliwe? Czy powinienem umieszczać te wartości w tablicy i zapętlać tablicę? Potrzebuję tego samego do produkcji adresów IP, a także nazw lokalizacji.
Wszystko po to, aby nie musieć powtarzać bloku kodu, którego użyję do synchronizacji plików na zdalnym serwerze.
źródło
Odpowiedzi:
Użyj tablicy.
źródło
Jak wskazują inne odpowiedzi, tablica jest najwygodniejszym sposobem na zrobienie tego. Jednak dla kompletności dokładnie tym, o co prosisz, jest ekspansja pośrednia . Przepisana w następujący sposób, Twoja próbka będzie również działać przy użyciu tej metody:
Jeśli nie masz nic przeciwko umieszczeniu listy adresów IP w
for
pętli, możesz również rozważyć użycie rozszerzeń nawiasów klamrowych w celu iteracji wszystkiego, czego potrzebujesz:Ale jeśli musisz ponownie użyć listy (być może rozwiniętej nawiasami klamrowymi), skorzystaj z tej listy do zainicjowania tablicy:
źródło
Chociaż prawdopodobnie wybrałbym jedną z odpowiedzi na tablicę, chciałbym zauważyć, że można bezpośrednio zapętlać nazwy. Możesz to zrobić
lub w wersji 4.3 i nowszej możesz użyć
nameref
:Kapelusz ilkkachu do rozwiązania <4.3.
źródło
${!var}
) działa również ze starszymi wersjami Basha:foo1=aa; foo2=bbb; foox=cccc; for p in "${!foo@}"; do echo "$p = ${!p}"; done
Każdy, kto powiedział, że powinieneś użyć tablicy, ma rację, ale - jako ćwiczenie akademickie - gdybyś był zdecydowany zrobić to z oddzielnymi zmiennymi kończącymi się liczbą (SERVER1, SERVER2 itp.), Tak właśnie zrobiłbyś to:
źródło
eval
jest trudny w użyciu bezpiecznie. Tak, to może działać, ale ogólnie pośrednia ekspansja bash jest lepszym sposobem.eval
maszecho $SERVER1
, nieecho "$SERVER1"
. Tak, możliwe do użycia w bezpieczny sposób, ale bardzo łatwy w użyciu niezgodnie lub niezgodnie z przeznaczeniem!