Петля, чтобы проверить, установлен ли пакет Debian или нет.

Мне нравится проверять, установлены ли несколько пакетов на Debian / Ubuntu. Вот моя попытка создать скрипт:

query=`dpkg-query -W -f '${Status}'` ok="install ok" if ! [ `$query` curl == "$ok" ] ;then apt-get -y -qq install curl >> /dev/null 2>&1 fi 

В результате

 Install: target Installed is not a directory 

но это должно быть то, что вы можете видеть во второй переменной. У меня головная боль, npw, потому что я не могу найти правильный способ справиться с этим.

  • Построение URL-адресов со списком слов и загрузка из URL-адресов с помощью командной строки
  • Изменить регистр n-й буквы в строке
  • Почему бы не использовать обратные ссылки для цикла
  • Как превратить весь stdin в аргумент командной строки дословно?
  • сценарий оболочки, чтобы найти комбинацию элементов массива
  • Как использовать: cat << EOF
  • Извлечение IP-адреса из текста и сохранение его в переменной
  • Определить сеанс tmux, к которому относится сеанс оболочки?
  • 3 Solutions collect form web for “Петля, чтобы проверить, установлен ли пакет Debian или нет.”

    Кажется, вы делаете что-то ненужным образом. Почему не просто

     dpkg -l curl || apt-get -y -qq install curl > /dev/null 2>&1 

    В конце концов, вы попросили один-лайнер. Поскольку, по-видимому, все, что вам нужно, это знать, доступен ли curl , вы также можете просто сделать

     type curl >/dev/null 2>&1 || apt-get -y -qq install curl 

    В вашем коде есть две ошибки, одна серьезная – не так много:

    1. Вы используете backticks дважды. Также не используйте обратные ссылки. Используйте подстановку команд следующим образом: $(command ...)

       query=$(dpkg-query -W -f '${Status}') 

      Запрос уже будет содержать результат вызова команды. Когда вы сейчас выполняете

       `$query` 

      вы теперь попытаетесь выполнить результат, который в вашем случае является строкой, для меня это очень длинная строка, состоящая из install ok installedinstall ok installed...

    2. (Костас указал на это) Результат dpkg-query -W -f '${Status}' curl будет install ok installed , а это не то, что вы проверяете.

    Нет никакого смысла проверять, установлен ли пакет и установка, если нет. Или:

    1. Вы проверяете, что вы хотите от пакета, например, curl binary: command -v curl , чтобы пользователь мог предоставить альтернативы, если им это нравится.
    2. Вы проверяете, установлена ​​ли какая-то конкретная версия того, что вы хотели, используя что-то вроде apt-cache policy .

    Если ни один из случаев не применяется, проще установить его непосредственно.

    Linux и Unix - лучшая ОС в мире.