Выполните команду, если выходные данные предыдущей команды имели определенное значение

Я пишу сценарий оболочки, который спрашивает меня, хочу ли я проверять мою систему на наличие обновлений при входе в систему. Если я говорю «да», он проверяет и перечисляет пакеты для обновления. Затем он спрашивает меня, хочу ли я обновить эти пакеты. Мне нужна команда, которая спрашивает меня, хочу ли я обновить пакеты, чтобы они запускались только тогда, когда есть один или несколько пакетов, которые необходимо обновить, и которые перечислены в списке после 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

По сути, это должно быть так: если этот бит текста находится в выводе предыдущей команды, то выполните следующую команду.

Любая помощь очень ценится. Спасибо!

0
задан 7 September 2019 в 09:24

2 ответа

#!/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

Версия 2

#!/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
1
ответ дан 23 October 2019 в 12:58

Получите количество доступных обновлений с:

/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
2
ответ дан 23 October 2019 в 02:58

Другие вопросы по тегам:

Похожие вопросы: