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 $# .