Логическое в Bash Script

Мне нужно логическое значение в 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».

2
задан 14 April 2019 в 23:14

3 ответа

Вы можете проверить, установлено ли программное обеспечение следующим образом:

if [ "$(dpkg -l | awk '/ansible/ {print }'|wc -l)" -ge 1 ]; then
  echo OK
else
  echo FAIL
fi

Вы не можете использовать код выхода, потому что он будет из awk и в этом случае всегда будет 0

3
ответ дан 14 April 2019 в 23:14

Если вы знаете точное имя пакета, вы можете просто спросить 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, поскольку присвоение такой переменной почти всегда успешно.

3
ответ дан 14 April 2019 в 23:14

Чтобы проверить, успешно ли установлен пакет с именем «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 тогда и только тогда, когда есть совпадение.

0
ответ дан 14 April 2019 в 23:14
  • 1
    " это требует, чтобы человек провел время, обновляя пакет, когда новый восходящий поток прибывает out" это - ясно ложь, все может быть сделано автоматизированным. Настоящая причина является второй, которую Вы упомянули. – gented 20 October 2018 в 17:33
  • 2
    " это требует, чтобы человек провел время, обновляя пакет, когда новый восходящий поток прибывает out" это - ясно ложь, все может быть сделано автоматизированным. Настоящая причина является второй, которую Вы упомянули. – gented 20 October 2018 в 17:33
  • 3
    " это требует, чтобы человек провел время, обновляя пакет, когда новый восходящий поток прибывает out" это - ясно ложь, все может быть сделано автоматизированным. Настоящая причина является второй, которую Вы упомянули. – gented 20 October 2018 в 17:33
  • 4
    " это требует, чтобы человек провел время, обновляя пакет, когда новый восходящий поток прибывает out" это - ясно ложь, все может быть сделано автоматизированным. Настоящая причина является второй, которую Вы упомянули. – gented 20 October 2018 в 17:33
  • 5
    " это требует, чтобы человек провел время, обновляя пакет, когда новый восходящий поток прибывает out" это - ясно ложь, все может быть сделано автоматизированным. Настоящая причина является второй, которую Вы упомянули. – gented 20 October 2018 в 17:33
  • 6
    " это требует, чтобы человек провел время, обновляя пакет, когда новый восходящий поток прибывает out" это - ясно ложь, все может быть сделано автоматизированным. Настоящая причина является второй, которую Вы упомянули. – gented 20 October 2018 в 17:33

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

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