Como foi apontado nos comentários à questão, o teste com >
não faz uma comparação aritmética, mas sim uma lexicográfica (de modo que 2 > 100
seja verdadeira, por exemplo), mas somente dentro de [[ ... ]]
. Em [ ... ]
, é um operador comum de redirecionamento de saída.
A filtragem grep -v "grep "
e grep -v "sh"
também pode filtrar processos legítimos da saída ps
(por exemplo, se você quiser usar seu script em grep
processes).
O script a seguir implementa a mesma lógica, mas usa 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
Se você estiver executando um comando top
em outro terminal, a execução deste script com top
como seu argumento informará One such process
. A execução de top
em dois terminais fará com que ele relate Many such processes
.
Com variáveis, como você usa:
#!/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
O script salva os PIDs retornados de pgrep
em uma matriz (e é por isso que este é um script bash
em vez de sh
) e, em seguida, testa o comprimento da matriz.
A seguir, uma adaptação para 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
Esse script sh
usa a única matriz à qual temos acesso, que é a matriz de parâmetros posicionais. Esses (os parâmetros posicionais) são definidos para os PIDs gerados por pgrep
com set
e o número deles é obtido de $#
.