Я пишу сценарий оболочки, который спрашивает меня, хочу ли я проверять мою систему на наличие обновлений при входе в систему. Если я говорю «да», он проверяет и перечисляет пакеты для обновления. Затем он спрашивает меня, хочу ли я обновить эти пакеты. Мне нужна команда, которая спрашивает меня, хочу ли я обновить пакеты, чтобы они запускались только тогда, когда есть один или несколько пакетов, которые необходимо обновить, и которые перечислены в списке после sudo apt update && apt list --upgradeable
. Как я могу это сделать? Вот мой сценарий:
read -r -p "Would you like to check your system for updates? [Y/n] " input
case $input in
[yY][eE][sS]|[yY])
sudo apt update && apt list --upgradeable
read -r -p "Would you like to update your system? [Y/n] " input
case $input in
[yY][eE][sS]|[yY])
sudo apt upgrade && sudo apt autoremove && sudo apt autoclean
;;
[nN][oO]|[nN])
clear
;;
*)
clear && echo "Invalid input..."
;;
esac
;;
[nN][oO]|[nN])
clear
;;
*)
clear && echo "Invalid input..."
;;
esac
По сути, это должно быть так: если этот бит текста находится в выводе предыдущей команды, то выполните следующую команду.
Любая помощь очень ценится. Спасибо!
#!/bin/bash
# update package list.
aptitude --quiet=2 update
# count upgradeable packages.
read -r c < <(aptitude --quiet=2 search '?narrow(?upgradable, ?not(?action(hold)))' | wc -l)
while true; do
(( $c <= 0 )) && break
read -r -p "You have $c upgradable packages, would you like to upgrade? [Y/n] " i
case ${i,,} in
[y]|[yes])
aptitude upgrade # --assume-yes --quiet=2
break
;;
[n]|[no])
echo "No action taken..."
break
;;
*)
echo "Invalid input..."
continue
;;
esac
done
exit 0
#!/bin/bash
# update package list.
apt-get --quiet=2 update
# count upgradeable packages.
read -r c < <(apt-get --no-act --quiet=2 upgrade | grep -c '^Inst')
while true; do
(( $c <= 0 )) && break
read -r -p "You have $c upgradable packages, would you like to upgrade? [Y/n] " i
case ${i,,} in
[y]|[yes])
apt-get upgrade # --assume-yes --quiet=2
break
;;
[n]|[no])
echo "No action taken..."
break
;;
*)
echo "Invalid input..."
continue
;;
esac
done
exit 0
Получите количество доступных обновлений с:
/usr/lib/update-notifier/apt-check
# returns (for example) 12;4
/usr/lib/update-notifier/apt-check --human-readable
# returns (for example)
12 packages can be updated.
4 updates are security updates.
/usr/lib/update-notifier/apt-check |& cut -d";" -f1
# returns (for example) 12
, Чтобы протестировать, если существуют доступные обновления, используйте последнюю команду и протестируйте его ouput против 0.
Вот простой сценарий, который сделает Ваш материал
Примечание, что это не обрабатывает плохие исходные данные, только выгоды'' ', да', 'ДА', 'y', 'Y', чтобы продолжить продолжаться. Если не 'да' вводит, то просто выходят из сценария.
#!/bin/bash
read -r -p "Would you like to check your system for updates? [Y/n] " response
response=${response,,} # tolower
if ! ([[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]); then
exit
fi
sudo apt update > /dev/null 2>&1
nUpgradables=$(/usr/lib/update-notifier/apt-check |& cut -d";" -f1)
if [ $nUpgradables -gt 0 ]; then
echo ${nUpgradables}" packages can be updated"
read -r -p "Would you like to update your system? [Y/n] " input
response=${response,,} # tolower
if ! ([[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]); then
exit
fi
sudo apt-get -f install # that is good to do too
sudo apt upgrade # upgrade, not 'upgrades'
sudo apt autoremove
sudo apt autoclean
else
echo "No upgrade available"
fi