grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
nonexisting-package NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
autotools-dev NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
bash NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
build-essential NOT installed!
grep: ]./install.sh: строка 7: [: пропущен `]'
: Нет такого файла или каталога
ddbus NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
desktop-file-utils NOT installed!
grep: ]./install.sh: строка 7: [: пропущен `]'
: Нет такого файла или каталога
libc6 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libcairo2 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libdbus-1-3 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libglib2.0-0 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libgtk2.0-0 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libgtk2.0-bin NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libpango1.0-0 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libstartup-notification0 NOT installed!
grep: ]./install.sh: строка 7: [: пропущен `]'
: Нет такого файла или каталога
libx11-6 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
shared-mime-info NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
intltool NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
pkg-config NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libgtk2.0-dev NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libglib2.0-dev NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
fakeroot NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libstartup-notification0-dev NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libdbus-1-dev NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libudev0 NOT installed!
grep: ./install.sh: строка 7: [: пропущен `]'
]: Нет такого файла или каталога
libudev-dev NOT installed!
BASH: проверить наличие пакета в системе (debian-like)
Простой скрипт на проверку наличия установленных пакетов в системе:
Код:
#!/bin/bash
for arg in nonexisting-package autotools-dev bash build-essential ddbus desktop-file-utils libc6 libcairo2 libdbus-1-3 libglib2.0-0 libgtk2.0-0 libgtk2.0-bin libpango1.0-0 libstartup-notification0 libx11-6 shared-mime-info intltool pkg-config libgtk2.0-dev libglib2.0-dev fakeroot libstartup-notification0-dev libdbus-1-dev libudev0 libudev-dev
do
if [ -n "dpkg -l | grep $arg" ] #если строка не пуста,
then
echo $arg" installed!" #то пакет установлен,
else
echo $arg" NOT installed!" #коли пуста, то не установлен. Логично?
fi
done
for arg in nonexisting-package autotools-dev bash build-essential ddbus desktop-file-utils libc6 libcairo2 libdbus-1-3 libglib2.0-0 libgtk2.0-0 libgtk2.0-bin libpango1.0-0 libstartup-notification0 libx11-6 shared-mime-info intltool pkg-config libgtk2.0-dev libglib2.0-dev fakeroot libstartup-notification0-dev libdbus-1-dev libudev0 libudev-dev
do
if [ -n "dpkg -l | grep $arg" ] #если строка не пуста,
then
echo $arg" installed!" #то пакет установлен,
else
echo $arg" NOT installed!" #коли пуста, то не установлен. Логично?
fi
done
Вообще - как проверить наличие пакета в системе, не устанавливая ничего лишнего?
Код:
#!/bin/bash
for arg in nonexisting-package autotools-dev bash build-essential ddbus desktop-file-utils libc6 libcairo2 libdbus-1-3 libglib2.0-0 libgtk2.0-0 libgtk2.0-bin libpango1.0-0 libstartup-notification0 libx11-6 shared-mime-info intltool pkg-config libgtk2.0-dev libglib2.0-dev fakeroot libstartup-notification0-dev libdbus-1-dev libudev0 libudev-dev
do
if [ -n ""dpkg -l | grep $arg"" ] #если строка не пуста,
then
echo $arg" installed!" #то пакет установлен,
else
echo $arg" NOT installed!" #коли пуста, то не установлен. Логично?
fi
done
for arg in nonexisting-package autotools-dev bash build-essential ddbus desktop-file-utils libc6 libcairo2 libdbus-1-3 libglib2.0-0 libgtk2.0-0 libgtk2.0-bin libpango1.0-0 libstartup-notification0 libx11-6 shared-mime-info intltool pkg-config libgtk2.0-dev libglib2.0-dev fakeroot libstartup-notification0-dev libdbus-1-dev libudev0 libudev-dev
do
if [ -n ""dpkg -l | grep $arg"" ] #если строка не пуста,
then
echo $arg" installed!" #то пакет установлен,
else
echo $arg" NOT installed!" #коли пуста, то не установлен. Логично?
fi
done
используйте конструкцию $(dpkg ... ) или символы обратной кавычки `dpkg .... `
Код:
...
if [[ -n ""dpkg -l | grep $arg"" ]] #если строка не пуста,
...
if [[ -n ""dpkg -l | grep $arg"" ]] #если строка не пуста,
...
кто-нибудь объяснит разницу между одинарными и двойными квадратными скобками?
надо найти какой-то другой способ определять статус пакета в системе
источнику: "...При использовании двойных скобок ваши переменный не будут разбиты на несколько отдельных слов если вы использовали пробел, как пример, переменная VAR="var with space" будет единым целым".
Насчет статуса можно (?) на основе команды: dpkg --status пакет | grep "ok installed"
Цитата по
Насчет статуса можно (?) на основе команды: dpkg --status пакет | grep "ok installed"
Запись [ -n "dpkg -l | grep $arg" ] проверяет длину строки "dpkg -l | grep $arg", не выполняя эти команды.
Чтобы получить результаты выполнения надо писать [ -n `dpkg -l | grep $arg` ], либо [ -n $(dpkg -l | grep $arg) ]
Двойные скобки и кавычки здесь ни при чем.
Код:
#!/bin/bash
#Проверка установленных пакетов из списка
#-----------------------------------------
#
#Вариант с командой dpkg --status
lst="nonexisting-package autotools-dev bash build-essential ddbus desktop-file-utils libc6 libcairo2 libdbus-1-3 libglib2.0-0 libgtk2.0-0 libgtk2.0-bin libpango1.0-0 libstartup-notification0 libx11-6 shared-mime-info intltool pkg-config libgtk2.0-dev libglib2.0-dev fakeroot libstartup-notification0-dev libdbus-1-dev libudev0 libudev-dev"
for items in $lst
do
cmd=$(dpkg --status $items 2>/dev/null | grep "ok installed")
if [ $? == 0 ]
then
echo "$items installed (установлен)"
else
echo "$items NOT installed (не установлен)"
fi
done
exit 0
#Проверка установленных пакетов из списка
#-----------------------------------------
#
#Вариант с командой dpkg --status
lst="nonexisting-package autotools-dev bash build-essential ddbus desktop-file-utils libc6 libcairo2 libdbus-1-3 libglib2.0-0 libgtk2.0-0 libgtk2.0-bin libpango1.0-0 libstartup-notification0 libx11-6 shared-mime-info intltool pkg-config libgtk2.0-dev libglib2.0-dev fakeroot libstartup-notification0-dev libdbus-1-dev libudev0 libudev-dev"
for items in $lst
do
cmd=$(dpkg --status $items 2>/dev/null | grep "ok installed")
if [ $? == 0 ]
then
echo "$items installed (установлен)"
else
echo "$items NOT installed (не установлен)"
fi
done
exit 0
Начиная с версии 2.02, Bash предоставляет в распоряжение программиста конструкцию [[ ... ]] расширенный вариант команды test, которая выполняет сравнение способом более знакомым программистам, пишущим на других языках программирования. Обратите внимание: [[ -- это зарезервированное слово, а не команда.
Bash исполняет [[ $a -lt $b ]] как один элемент, который имеет код возврата.
Круглые скобки (( ... )) и предложение let ... так же возвращают код 0, если результатом арифметического выражения является ненулевое значение. Таким образом, арифметические выражения могут учавствовать в операциях сравнения.
Конструкция [[ ]] более универсальна, по сравнению с [ ]. Этот расширенный вариант команды test перекочевал в Bash из ksh88.
Внутри этой конструкции не производится никакой дополнительной интерпретации имен файлов и не производится разбиение аргументов на отдельные слова, но допускается подстановка параметров и команд.
Конструкция [[ ... ]] более предпочтительна, нежели [ ... ], поскольку поможет избежать некоторых логических ошибок. Например, операторы &&, ||, < и > внутри [[ ]] вполне допустимы, в то время как внутри [ ] порождают сообщения об ошибках.
Внутри (( )) производится вычисление арифметического выражения. Если результатом вычислений является ноль, то возвращается 1, или "ложь". Ненулевой результат дает код возврата 0, или "истина". То есть полная противоположность инструкциям test и [ ]
Код:
#!/bin/bash
#Проверка установленных пакетов из списка
#-----------------------------------------
#
#Вариант с командой dpkg -l
lst="nonexisting-package autotools-dev bash build-essential ddbus desktop-file-utils libc6 libcairo2 libdbus-1-3 libglib2.0-0 libgtk2.0-0 libgtk2.0-bin libpango1.0-0 libstartup-notification0 libx11-6 shared-mime-info intltool pkg-config libgtk2.0-dev libglib2.0-dev fakeroot libstartup-notification0-dev libdbus-1-dev libudev0 libudev-dev"
dpkg -l 2>/dev/null > ls.tmp
for items in $lst
do
cmd=$(grep "\ $items\ " ls.tmp)
if [ $? == 0 ]
then
echo "$items installed (установлен)"
else
echo "$items NOT installed (не установлен)"
fi
done
rm ls.tmp
exit 0
#Проверка установленных пакетов из списка
#-----------------------------------------
#
#Вариант с командой dpkg -l
lst="nonexisting-package autotools-dev bash build-essential ddbus desktop-file-utils libc6 libcairo2 libdbus-1-3 libglib2.0-0 libgtk2.0-0 libgtk2.0-bin libpango1.0-0 libstartup-notification0 libx11-6 shared-mime-info intltool pkg-config libgtk2.0-dev libglib2.0-dev fakeroot libstartup-notification0-dev libdbus-1-dev libudev0 libudev-dev"
dpkg -l 2>/dev/null > ls.tmp
for items in $lst
do
cmd=$(grep "\ $items\ " ls.tmp)
if [ $? == 0 ]
then
echo "$items installed (установлен)"
else
echo "$items NOT installed (не установлен)"
fi
done
rm ls.tmp
exit 0