Кроме того: вы можете удалить wc -l
, используя grep -c Файл конфигурации FailoverVM.Name
.
Но если вы хотите использовать числа больше 9 десятичных (например, не 123456789abcdef), ваш шаблон должен быть FailoverVM [0-9] [0-9]? Имя
или ] FailoverVM [0-9] {1,2} Имя
в -E
расширенном режиме.
Также для i $ VMCount
является синтаксической ошибкой; Я предполагаю, что вы имеете в виду для i в $ (seq $ VMCount)
.
Вы можете прочитать переменную косвенно в bash с помощью !
(bang) и еще одна переменная, содержащая имя:
for i in $(seq $VMCount); do
selname=FailoverVM${i}Name
selip=FailoverVM${i}IP
selport=FailoverVM${i}Port
echo name ${!selname} is IP ${!selip} and port ${!selport}
done
, которое меньше похоже на мушкетон, чем eval
, но все же неуклюже. Но вы не можете установить переменную таким образом, поэтому вы должны использовать для этого массив. И вы не можете сделать это для функций, поэтому вместо этого напишите одну функцию, которая принимает аргумент, чтобы сообщить ей, какие (набор) переменных использовать:
for i in $(seq $VMCount); do
selip-Failover${i}IP
selport=Failover${i}Port
checkVM[$i]=$(nc -vvz ${!selip} ${!selport} 2>/devnull)
}
StartVM() { # first argument to a function is accessed as $1 or ${1}
selname=FailoverVM${1}Name
if [[ checkVM[$1] =~ 'succeeded' ]]
# only need to check the part that matters
then echo number $1 name ${!selname} already up
else echo starting number $1
su -c "VboxManager startvm ${!selname} -headless" vbox
# note " because ' prevents the variable expansion
fi
]
...
StartVM 1 # and
StartVM 2 # etc
OTOH, если вы можете изменить конфигурацию для использования переменных массива для всего подобного
FailoverIP[1]=10.255.1.1 FailoverName[1]=robin
FailoverIP[2]=10.255.2.2 FailoverName[2]=bluejay
etc
это сделало бы все намного проще. И тогда вам не нужно повторно использовать grep для файла для подсчета записей, вы можете просто использовать, например, $ {# FailoverName [@]}