Как прочитать 2 переменные внутри для l oop in bash - PullRequest
0 голосов
/ 09 апреля 2020
USER=ssubra
KEY=.ssh/shantip_rsa
HOST1=cassandraeast1
HOST2=cassandraeast2
HOST3=cassandraeast3
HOST4=cassandraeast4
HOST5=cassandrawest1
HOST6=cassandrawest2
HOST7=cassandrawest3
HOST8=cassandrawest4

no_key_check="-o LogLevel=QUIET -o StrictHostKeyChecking=no"
SSH1="ssh -i $KEY $no_key_check $USER@$HOST1"

for num in {1..8}
do
  echo "SSH$num=ssh -i $KEY $no_key_check $USER@$HOST$num"
done

** Я получаю вывод как **

Мой код не читает $ HOST, а вместо этого читает $ num

SSH1=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@1
SSH2=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@2
SSH3=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@3
SSH4=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@4
SSH5=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@5
SSH6=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@6
SSH7=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@7
SSH8=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@8

Требуемый вывод

SSH1=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandraeast1
SSH2=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandraeast2
SSH3=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandraeast3
SSH4=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandraeast4
SSH5=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandrawest1
SSH6=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandrawest2
SSH7=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandrawest3
SSH8=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandrawest4

Он не принимает в качестве $ HOST1 вместо 1 и оставляет $ HOST

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Возможно, я бы хотел сделать это немного проще, используя массив для хранения различных значений HOST, например:

$ HOST=(dummy cassandraeast1 cassandraeast2 cassandraeast3 cassandraeast4 cassandrawest1 cassandrawest2 cassandrawest3 cassandrawest4)

ПРИМЕЧАНИЕ. Я добавил «пустышку» в качестве заполнителя для заполнения позиция с индексом = 0; это позволяет вам продолжать использовать текущий диапазон ({1..8}) без каких-либо изменений кода.

$ typeset -p HOST
declare -a HOST=([0]="dummy" [1]="cassandraeast1" [2]="cassandraeast2" [3]="cassandraeast3" [4]="cassandraeast4" [5]="cassandrawest1" [6]="cassandrawest2" [7]="cassandrawest3" [8]="cassandrawest4")

ПРИМЕЧАНИЕ. Вы можете удалить запись индекса 0, если хотите (хотя это не должно вызывать никаких проблем). для вашего текущего кода):

$ unset HOST[0]
$ typeset -p HOST
declare -a HOST=([1]="cassandraeast1" [2]="cassandraeast2" [3]="cassandraeast3" [4]="cassandraeast4" [5]="cassandrawest1" [6]="cassandrawest2" [7]="cassandrawest3" [8]="cassandrawest4")

Затем вы можете изменить свой код следующим образом для ссылки на значения массива:

old: echo "SSH$num=ssh -i $KEY $no_key_check $USER@$HOST$num"
new: echo "SSH${num}=ssh -i ${KEY} ${no_key_check} ${USER}@${HOST[${num}]}"

ПРИМЕЧАНИЕ. В этом случае фигурные скобки ({}) являются необязательными для имен переменных, но я предпочитаю использовать их для того, чтобы сделать имена переменных более заметными среди остального кода.

Что должно дать вам желаемый результат:

SSH1=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandraeast1
SSH2=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandraeast2
SSH3=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandraeast3
SSH4=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandraeast4
SSH5=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandrawest1
SSH6=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandrawest2
SSH7=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandrawest3
SSH8=ssh -i .ssh/shantip_rsa -o LogLevel=QUIET -o StrictHostKeyChecking=no ssubra@cassandrawest4
1 голос
/ 09 апреля 2020

Вы можете использовать bash косвенное расширение. Как то так:

for num in {1..8}
do
  host="HOST$num"
  echo "SSH$num=ssh -i $KEY $no_key_check $USER@${!host}"
done
...