Как было указано в комментариях к вопросу, проверка с помощью >
выполняет не арифметическое сравнение, а лексикографическое (, так что 2 > 100
верно, например ), но только в пределах [[... ]]
. В [... ]
это обычный оператор перенаправления вывода.
Фильтрация grep -v "grep "
и grep -v "sh"
также может отфильтровывать допустимые процессы из ps
вывода (, например, если вы хотите использовать свой скрипт в grep
процессах ).
Следующий скрипт реализует ту же логику, но используетpgrep
:
#!/bin/bash
cmd=$1
pids=( $( pgrep "$cmd" ) )
case "${#pids[@]}" in
0) echo 'No such process' ;;
1) echo 'One such process' ;;
*) echo 'Many such processes'
esac
Если вы запускаете одну команду top
в другом терминале, запуск этого скрипта с top
в качестве аргумента сообщит One such process
. Запуск top
на двух терминалах заставит его сообщить Many such processes
.
С переменными, как вы используете:
#!/bin/bash
cmd=$1
pids=( $( pgrep "$cmd" ) )
critical=0
ok=1
case "${#pids[@]}" in
$critical) echo 'No such process' ;;
$ok) echo 'One such process' ;;
*) echo 'Many such processes'
esac
Сценарий сохраняет PID, возвращенные из pgrep
, в массив (, поэтому это сценарий bash
, а не sh
), а затем проверяет длину массива.
Ниже приводится адаптация кsh
:
#!/bin/sh
cmd=$1
set -- $( pgrep "$cmd" )
critical=0
ok=1
case "$#" in
$critical) echo 'No such process' ;;
$ok) echo 'One such process' ;;
*) echo 'Many such processes'
esac
Этот sh
скрипт использует единственный доступный нам массив, который является массивом позиционных параметров. Эти (позиционные параметры )устанавливаются в PID, сгенерированные pgrep
с set
, и их количество взято из $#
.
Добавить источник вручную (безadd-apt-repository
):
echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu groovy stable" |sudo tee /etc/apt/sources.list.d/docker-ce.list
sudo apt update
sudo apt install docker-ce