Оператор цикла for в bash

Великая магия оператора for о которую приходится биться каждый раз пока не усвоишь урок, кроется в том что он рубит входные данные по символам разделителям которые перечислены в переменной IFS=

Не менее странным является и то, что этой переменной невозможно присвоить один байт-символ CR (возврат каретки) 0xA.
Никакие танцы с бубнами и операторы echo не дают этой возможности.
Два символа можно

IFS=$(echo -en "\n\b") # работает
echo -en "$IFS" | hexdump -C
00000000  0a 08                                             |..|
00000002

но один или много \n — не получается.

IFS=$(echo -en "\n\n\n\n\n") # не работает. Переменная будет пустой.
echo -en "$IFS" | hexdump -C # да говорю же следующая строка будет пустой

IFS=$(echo -en "A" | tr 'A' '\n') # не пойдёт!
IFS="\
\
" # тоже не будет работать

Continue reading Оператор цикла for в bash

ssh внутри while цикла который получает данные из stdin

Наткнулся я на то что скрипт запущенный локально — работает, а если его запустить на удалённой машине он вываливается из цикла while

#!/bin/bash

  SERVERS="10.10.1.6\n10.15.4.240"

  echo -e "${SERVERS}" | while read SERVER ; do
    echo -e "${SERVER}"
    ssh root@${SERVER} "uptime"
  done

Как оказалось проблема в том что ssh съедает stdin в первой итерации цикла.
Для меня это было неожиданно, однако лечится либо опцией -n либо перенаправлением stdin на < /dev/null .

#!/bin/bash

  SERVERS="10.10.1.6\n10.15.4.240"

  echo -e "${SERVERS}" | while read SERVER ; do
    echo -e "${SERVER}"
    ssh -n root@${SERVER} "uptime"
    ssh root@${SERVER} "uptime" < /dev/null
  done