Mam w skrypcie następujące elementy
for server in ${servers[@]}; do
echo ${server}
ssh user@${server} "for i in /tmp/foo* ; do echo ${i}; done"
done
Ale to nie działa. Dziwne, widzę $ I linii zwrotu. Więc jeśli mam dziesięć plików, widzę dziesięć pustych linii.
--sshlogin
.Odpowiedzi:
Lokalna powłoka interpretuje
${i}
podwójne cudzysłowy ("
), więc polecenie działa'
Zamiast tego użyj pojedynczego cudzysłowu ( ), a Twój problem zniknie:źródło
Właśnie natknąłem się na ten problem nieco wstecz, a podane rozwiązanie, podczas gdy działa, nie jest zbyt skuteczne, jeśli pobierasz zmienne z lokalnej powłoki, przed ssh tworzysz tablicę do iteracji. Nieco bardziej niechlujnym byłoby po prostu uciec od $ początkowo, tak by było
"for i in /tmp/foo* ; do echo \${i}; done"
Który uciekłby z niego w obrębie lokalnej konstrukcji, a nie zwanej powłoką ssh.
źródło
Zaktualizowałem powyższą odpowiedź, aby uzyskać porty również z listy.
źródło