После моего предыдущего вопроса , который был закрыт - в основном у меня есть скрипт, который проверяет доступность пакетов на целевом сервере, целевой сервер и пакеты были сохранены в массиве.
declare -a prog=("gdebi" "firefox" "chromium-browser" "thunar")
declare -a snap=("beer2" "beer3")
# checkvar=$(
for f in "${prog[@]}"; do
for connect in "${snap[@]}"; do
ssh lg@"$connect" /bin/bash <<- EOF
if dpkg --get-selections | grep -qE "(^|\s)"$f"(\$|\s)"; then
status="[INSTALLED] [$connect]"
else
status=""
fi
printf '%s %s\n' "$f" "\$status"
EOF
done
done
С помощью одного из моих коллег я сделал несколько исправлений для оригинального скрипта, скрипт работал довольно хорошо - за исключением одной проблемы, вывод содержит повторяющиеся записи.
gdebi [INSTALLED] [beer2]
gdebi
firefox [INSTALLED] [beer2]
firefox [INSTALLED] [beer3]
chromium-browser [INSTALLED] [beer2]
chromium-browser [INSTALLED] [beer3]
thunar
thunar
Я знаю это так это нормальное поведение, так как for
передает несколько серверов из массива snap
, заставляя ssh
отправляться на все два сервера.
Учитывая, что скрипт проверяет один и тот же пакет для двух серверов, я хочу, чтобы вывод быть объединенным.
Если beer2
имеет firefox
пакетов, но beer3
нет.
firefox [INSTALLED] [beer2]
Если * У 1026 * есть firefox
пакетов, но beer2
нет.
firefox [INSTALLED] [beer3]
Если оба пакета beer2
и beer3
имеют.
firefox [INSTALLED] [beer2, beer3]
или
firefox [INSTALLED] [beer2] [beer3]
Если оба пакета beer2
и beer3
не имеют пакета, он вернется без дополнительных параметров.
firefox
Звучит как легкая задача, но ради любви к Богу я не могу найти, как этого достичь, вот список вещей, которые у меня есть пробовал.
- Попробуйте манипулировать циклами
for
. - Попробуйте выставить возвращаемое значение после одного успешного цикла (код выхода).
- Попробуйте вложенный
if
, Все вышеперечисленное, похоже, не работает, я не пробовал изменять / манипулировать возвращаемой строкой, поскольку я не очень разбираюсь в какой-либо обработке текста, такой как: awk
, sed
, tr
и многие другие .
Может кто-нибудь покажет, как это делается? Это действительно значило бы для меня мир.