I want to backup mikrotiks via scp. This script loops through the hosts from the hosts.txt. One by one, connects to each device from the list. Does backup and all manipulations. If at some stage it was not possible to connect to the device, then an empty backup is formed, which is then sent to the cloud. I want to check. If it was not possible to connect to the host, then write this host into a variable, line by line, and go to the next device. Next, I will notify about all failed connections. The problem is that only the first error is written to the variable, all subsequent ones are ignored. Tell me who knows what.
#!/bin/bash
readarray -t hosts < hosts.txt
DATE=$(date +'%Y-%m-%d_%H-%M-%S')
ROS='<br>'
ERR=( )
 #Get values from main list
for host in ${hosts[*]}
do
    #Get values from sub list
    hostname=($(echo ${host} | tr "_" " "))
    echo ${hostname[0]} - ${hostname[1]}
    #connect & backup & transfer & archive & rm old files & moove to cloud
    if ssh backup@${hostname[0]} -C "/system backup save name=${hostname[1]}_$DATE"; then
        scp backup@${hostname[0]}:"${hostname[1]}_$DATE.backup" ./
        ssh backup@${hostname[0]} -C "rm ${hostname[1]}_$DATE.backup"
        tar -czvf ./${hostname[1]}_$DATE.tar.gz ${hostname[1]}_$DATE.backup
        scp ./${hostname[1]}_$DATE.tar.gz my@cloud.com:/var/www/my.cloud.com/backups/mikrotik/
        rm ${hostname[1]}_$DATE.backup ${hostname[1]}_$DATE.tar.gz
        ROS=$ROS${hostname[1]}"<br>"
    else
        ERR+=(${hosts[*]} "is not ready")
    fi
done
hosts.txt
10.10.8.11_CAP-1
10.10.9.12_CAP-2
10.10.10.13_CAP-3
 
     
    
"` as `ROS="$ROS${hostname[1]}
"`, enclosing the whole RHS in double quotes. – Jonathan Leffler Dec 22 '20 at 17:46