Как правильно передать переменные из файла в bash?
Всем доброго времени. У меня небольшой опыт в bash, но я прочитал все что нашел, прежде чем написать сюда. У меня есть текстовый файл со строками:
disk1
disk2
disk3
Этот файл - результат команды:
disk list | awk -F"|" '/backup/ {print $3}' | sed s/' '//g > backupdisks.txt
Если получится от него отказаться, и вывод команды и сразу преобразовывать вывод команды в переменные, будет еще лучше. Количество строк может меняться время от времени. Мне нужно в скрипте bash взять эти строки и вставить в команду
Я не понимаю как импортировать каждую строку в переменную disk1 , disk2... чтобы потом также подставить их во вторую команду. я прочитал и попробовал
while read -r disk
do
echo "${disk}"
done < backupdisks.txt
_________________________
read var2 var3
echo "var2 = $var2 var3 = $var3"
________________________
file=backupdisks.txt
while IFS= read -r line
do
# echo line is stored in $line
echo $line
done < "$file"
________________________
Наверное я никак не могу понять как это работает.
Это работает. И кажется я начинаю понимать как. Спасибо. Если не сложно, подскажите как запуcтить это по всем дискам одновременно. Вот весь код скрипта, я пытаюсь сделать простейшее резервное копирование в Yandex Cloud (которого там нет) через снапшоты. Возможно он еще кому то пригодится.
#!/bin/bash
getDate() {
date '+%d%m%Y'
}
getDate1() {
date '+%d%m%Y' --date='3 days ago'
}
now=$(getDate)
del=$(getDate1)
for disk in `yc compute disk list --folder-id "id вашей папки" | awk -F"|" '/backup/ {print $3}' | sed s/' '//g`
do
(
yc compute snapshot create --folder-id "id вашей папки" --name ${disk}-$now --disk-name ${disk} &&\
yc compute snapshot delete --folder-id "id вашей папки" --name ${disk}-$del
) & disown
done
Если не сложно, подскажите как запуcтить это по всем дискам одновременно.
Нужно поставить утилиту parallel, если не стоит, и получится что-то такое:
disk list | awk -F"|" '/backup/ {print $3}' | sed s/' '//g | xargs parallel snapshot create --name {}-$now --disk-name {}
Здесь вместо обхода найденных дисков в цикле мы разом получаем их список и через xargs прокидываем его в parallel, который запустит команды параллельно, а имя диска для каждой будет передано в {}.
getDate() {
date '+%d%m%Y'
}
getDate1() {
date '+%d%m%Y' --date='3 days ago'
}
now=$(getDate)
del=$(getDate1)
зачем вам здесь такое извращение ? сначала в функцию, а потом в переменную, в коротком скрипте где единожды используете данные переменные.
yc compute disk list --folder-id "id вашей папки" | awk -F"|" '/backup/ {print $3}' | sed s/' '//g
зная вывод yc compute disk list здесь скорее всего можно было бы сократить до одной команды обработки.
(...)& disown
это конечно круто, запускаете скрипт который запускает N(по числу дисков) процессов yc, открепляете(disown) их, завершаете скрипт, а запущенные процессы по мере готовности завершаются и рапортуют например в лог файл(который я надеюсь допишите). Теперь вопрос, а что если один или несколько из этих процессов зависли ?