Мне нужно логическое значение в Bash Script. Например.
Как мне это сделать, используя bash?
Я нашел что-то подобное, но я не знаю, как правильно его использовать.
dpkg -l | grep "ansible" | awk '{print $2}'
if [$? -eq 0]; then
echo OK
else
echo FAIL
fi
Мне нужно проверить, если команда dpkg -l | grep "ansible" | awk '{print $2}'
возвращает мне слово «Ansible», тогда эхо ОК, иначе эхо FAIL.
@EDIT
Я думаю, что лучше будет команда
dpkg -l | grep "ansible" | awk '{print $2}'
, поэтому эта команда вернет мне два слова:
ansible
ansible_lint
Как использовать этот скрипт bash ? Если я делаю что-то подобное:
ansible = $?
if [$? -eq 0]; then
echo OK
else
echo FAIL
fi
это не работает, но я уверен, что делаю это неправильно. Как я могу прочитать результат из dpkg -l | grep "ansible" | Команда awk '{print $ 2}', и если я получу слово «ansible», скрипт выведет «OK», если не выведет «FAIL».
Вы можете проверить, установлено ли программное обеспечение следующим образом:
if [ "$(dpkg -l | awk '/ansible/ {print }'|wc -l)" -ge 1 ]; then
echo OK
else
echo FAIL
fi
Вы не можете использовать код выхода, потому что он будет из awk
и в этом случае всегда будет 0
Если вы знаете точное имя пакета, вы можете просто спросить dpkg
, установлен ли он с
dpkg -l packagename
Например:
$ dpkg -l pulsea
dpkg-query: no packages found matching pulsea
Код выхода также равен 1 ( потерпеть неудачу), если пакет не установлен, вы можете проверить это (как показано позже).
$ dpkg -l pulseaudio
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==================-==============-==============-=========================
ii pulseaudio 10.0-1+deb9u1 i386 PulseAudio sound server
Здесь код выхода равен 0 (успех), так что вы можете сделать это тоже
$ if dpkg -l pulseaudio; then echo yes;fi
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==================-==============-==============-=========================
ii pulseaudio 10.0-1+deb9u1 i386 PulseAudio sound server
yes
Обратите внимание на завершающее «да» выше. Но теперь, так как вы можете просто использовать код выхода, вы на самом деле не заботитесь о выводе dpkg, поэтому игнорируйте его с помощью if
или &&
(AND list):
$ if dpkg -l pulseaudio >/dev/null; then echo yes;fi
yes
$ dpkg -l pulseaudio >/dev/null && echo yes
yes
dpkg can также сопоставьте частичные имена, используя звездочки, например
$ dpkg -l "*pulse*"
О каналах и их состоянии выхода, если вы хотите увидеть, если команда где-то в конвейере потерпела неудачу, вам придется сделать что-то вроде проверка ${PIPESTATUS[@]}
:
$ false | true
$ echo ${PIPESTATUS[@]}
1 0
И, как и $?
, ${PIPESTATUS[@]}
изменяется с каждой командой, поэтому, если вы хотите проверить их несколько раз, сначала нужно сохранить их в другой переменной. В вашем примере
ansible = $?
if [$? -eq 0]; then
$?
уже изменился с помощью теста if, и, вероятно, он равен 0, поскольку присвоение такой переменной почти всегда успешно.
Чтобы проверить, успешно ли установлен пакет с именем «pkgname», используйте
if dpkg-query -W -f'${db:Status-Abbrev}\n' pkgname 2>/dev/null \
| grep -q '^.i См. man dpkg-query
об использовании dpkg-query
. С опцией -q
grep
ничего не выводит, но выходит с кодом 0 тогда и только тогда, когда есть совпадение.
; then
echo 'Installed'
else
echo 'Not installed'
fi
См. man dpkg-query
об использовании dpkg-query
. С опцией -q
grep
ничего не выводит, но выходит с кодом 0 тогда и только тогда, когда есть совпадение.