Вывести текущую итерацию в цикл while - PullRequest
0 голосов
/ 08 января 2020

У меня есть следующая строка в моем скрипте, массив ${snap[@]} содержит мой список серверов s sh.

      while IFS= read -r con; do
    ssh foo@"$con" /bin/bash <<- EOF
      echo "Current server is $con"
EOF
      done <<< "${snap[@]}"

Я хочу напечатать текущее значение итерации массива при запуске s sh успешно, $con должен напечатать текущий сервер * sh -> example@server. Как бы я это сделал?

Ответы [ 2 ]

2 голосов
/ 08 января 2020

Если элементы в snap являются хостами, к которым вы хотите подключиться, просто используйте for l oop:

for con in "${snap[@]}"; do
  # connect to "$con"
done

"${snap[@]}", чтобы развернуть список, указанный в безопасном кавычке элементов в массиве snap, пригодных для использования с for.

Если вы действительно хотите использовать while, то вы можете сделать что-то вроде этого:

i=0
while [ $i -lt ${#snap[@]} ]; do # while i is less than the length of the array
  # connect to "${snap[i]}"
  i=$(( i + 1 ))                 # increment i
done

Но, как вы можете видеть, это более неловко, чем for подход.

1 голос
/ 08 января 2020

Как это:

while IFS= read -r con; do
    ssh "foo@$con" /bin/bash <<EOF
        echo "Current server is $con"
EOF
done < <(printf '%s\n' "${snap[@]}")
#    ____
#      ^
#      |
# bash process substitution < <( )

Или просто:

for server in "${snap[@]}"; do
    ssh "foo@$con" /bin/bash <<EOF
        echo "Current server is $con"
EOF
done
...