Скрипт для проверки, если какая-то программа уже установлена


11

Как я могу создать bash-скрипт, который проверяет, установлена ​​ли программа, а если нет, устанавливает ее?

Спасибо за вашу помощь.

Вот код, который у меня есть:

#/bin/bash

PS3="choose an option"

select opcion in "Installing_Youtube"  "exit"

do

    case $opcion in


        "Installing_Youtube")

            youtube-dl > /usr/bin
            if [ $? -eq 127 ] ; then
                echo "installing youtube"
                 apt-get update
                 apt-get install youtube-dl
                mkdir Videos
            else
                echo "Youtube already installed"
            fi

        ;;


        "exit")
            exit

10
Вы собираетесь перезаписать /usr/bin?
Д. Бен Кнобл

1
Вы различаете имена пакетов и исполняемые имена файлов? Или хотите проверить оба? Только ответ Джорджа в настоящее время проверяет наличие исполняемых файлов
Xen2050

Почему вы хотите это проверить? Каково целевое использование этого скрипта?
Брайам

@Braiam По крайней мере с apt установка уже установленного пакета изменит его статус с автоматического на ручной, если он был установлен только как зависимость от другого пакета. Если этот другой пакет будет позже удален, этот пакет больше не будет помечен для автоматического удаления. У меня есть скрипт для установки отредактированного списка пакетов из предыдущей установки в новый. Эта техника не дает запутаться в новой системе.
Джо

@ Джо, который является плохим решением. Вместо этого вы должны просто получить список установленных пакетов с apt-mark showmanualпоследующей установкой с чем-то вроде apt-get install "$(< package.list)".
Брайам

Ответы:


11

ты можешь это сделать:

dpkg -s <packagename> &> /dev/null

затем проверьте статус выхода. только если статус выхода вышеупомянутой команды был равен 0тогда установленному пакету .

так:

   #!/bin/bash

    echo "enter your package name"
    read name

    dpkg -s $name &> /dev/null  

    if [ $? -ne 0 ]

        then
            echo "not installed"  
            sudo apt-get update
            sudo apt-get install $name

        else
            echo    "installed"
    fi

Кроме этого нет? Что случилось с линией sudo apt install $name? Команде нужно перейти на следующую строку ... В противном случае, хорошая работа ...
Zanna

3
Обратите внимание, что программное обеспечение может быть установлено различными способами и dpkgотносится только к установленным пакетам Debian. В частном случае OP, youtube-dlнапример, также может быть установлен через менеджер пакетов pythonpip
Сергей Колодяжный

2
Почему нет if dpkg -s “$name” &> /dev/null ; then? Тот же эффект, чище / яснее имо.
Д. Бен Кнобл

действительно, проверка статуса выхода - это именно то, что ifделает ...
Zanna

4

Вот функция, которую я написал для цели, которую я использую в своих сценариях. Он проверяет, установлен ли требуемый пакет, и, если нет, предлагает пользователю установить его. Требуется имя пакета в качестве параметра. Если вы не знаете название пакета, к которому относится необходимая программа, вы можете найти его. Информация об этом доступна здесь.

function getreq {
dpkg-query --show  "$1"
if [ "$?" = "0" ];
then
    echo "$1" found
else
    echo "$1" not found. Please approve installation.
    sudo apt-get install "$1"
    if [ "$?" = "0" ];
    then echo "$1" installed successfully.
    fi
fi
}

3

Эта командная строка проверит использование whichпрограммы и вернет, 0если установлено, а 1если нет:

which apache | grep -o apache > /dev/null &&  echo 0 || echo 1

Конечно, вы будете использовать это таким образом в вашем скрипте:

which "$1" | grep -o "$1" > /dev/null &&  echo "Installed!" || echo "Not Installed!"

Простое использование будет:

#!/usr/bin/env bash
set -e

function checker() { 
        which "$1" | grep -o "$1" > /dev/null &&  return 0 || return 1 
}

if checker "$1" == 0 ; then echo "Installed"; else echo "Not Installed!"; fi

Обратите внимание на несколько вещей:

  1. Вам придется иметь дело с проблемами зависимости при установке
  2. Чтобы избежать взаимодействия со скриптом во время установки, смотрите здесь примеры.
  3. Вы можете поймать возвращаемые значения из этой функции и использовать ее, чтобы решить, устанавливать или нет.

whichсупер непереносимый Я часто использую command -vвместо этого, но это сильно зависит от типа имени, которое вы ищете (псевдоним, функция, исполняемый файл и т.
Д.

Супер непереносимый на вопрос, который для машины Ubuntu? Это не Unix & Linuxсайт! Если бы я отвечал на это на Unix & Linuxсайте, это было бы другое дело!
Джордж Удосен

3

Почему вы хотите проверить это в первую очередь? Если у вас нет веских причин для этого, не делайте этого, просто apt-get install packageзакончите. Если он уже установлен, он будет обновлен, если будет доступна более новая версия, если она установлена ​​и обновлена, ничего не произойдет. В случае, если у вас есть какая-то конфигурация, которую необходимо применить, есть другие варианты, например, создание пакета конфигурации, который зависит от пакета, или использование программного обеспечения для управления конфигурацией, например ansible.


1
Часто случается что-то: по крайней мере, с помощью apt установка уже установленного пакета изменит его статус с автоматического на ручной, если он был установлен только в зависимости от другого пакета. Если этот другой пакет будет позже удален, этот пакет больше не будет помечен для автоматического удаления. У меня есть скрипт для установки отредактированного списка пакетов из предыдущей установки в новый. Эта техника не дает запутаться в новой системе.
Джо

2

Один простой способ проверить наличие установленных пакетов, используя apt-mark:

apt-mark showinstallотобразит список всех пакетов, помеченных как установленные (уже установленные или поставленные в очередь для установки). После этого достаточно просто найти нужные вам пакеты.

Пример: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"


Вы на правильном пути! Просто измените это на это, чтобы устранить ложные срабатывания: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "установлен" || эхо "не"
Эрик Минц

@EricMintz - спасибо за улучшение! Ред.
user535733
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.