Script de bash: verifique uma lista de comandos

1

Eu tenho um script bash que lança um comando ps com uma lista de comandos como este:

comando="ps -o pid,pcpu,cmd -C \"$2\""

$ 2 deve ser uma variável neste formato: command1 ou command1 command2 command3 ... commandn

Como posso verificar essa variável para evitar erros? Eu preciso de um controle (com um if) para verificar o padrão.

EDIT: ps pode ser chamado desta maneira:

ps -o pid,pcpu,cmd -C "command1 command2 ... commandn" . Se alguém chamar esse script bash como script.sh -C " command1 command2" , o comando ps retornará "IMPRROPER LIST". Eu quero evitar o erro ps e ecoar meu erro antes de lançar o comando ps .

    
por Marco de Nadai 13.08.2010 / 11:17

2 respostas

1

Você deve evitar colocar comandos em variáveis .

Se houver espaços, você pode desmembrá-los assim:

ps -o pid,pcpu,cmd -C ${2// }

Isso removerá todos os espaços, portanto, se alguma das suas strings de comando contiverem espaços, isso os arruinará. Isso tira os espaços e espaços iniciais e finais dos dois lados das vírgulas:

commands=${2/# }          # leading space
commands=${command/% }    # trailing space
commands=${command/, /,}  # spaces after commas
commands=${command/ ,/,}  # spaces before commas
ps -o pid,pcpu,cmd -C "$commands"

Se você quiser retornar um erro em vez de sanear e executar a entrada, apenas faça essa remoção de espaço ou outra limpeza e verifique se o resultado é igual à entrada. Se eles não estiverem, emita um erro.

    
por 13.08.2010 / 16:06
0

Poderia funcionar com um loop for

arguments="command1 command2 command3 command4 command5"
for arg in $arguments
do
    ps -o pid,pcpu,cmd -C $arg
done

resultados:

ps -o pid,pcpu,cmd -C command1
ps -o pid,pcpu,cmd -C command2
ps -o pid,pcpu,cmd -C command3
ps -o pid,pcpu,cmd -C command4
ps -o pid,pcpu,cmd -C command5

Talvez você possa dar um exemplo real melhor de como isso deve funcionar, o que você está esperando ... não parece muito claro para mim.

Para chamá-lo a partir da linha de comando, como expliquei no comentário, use $* para capturar todos os argumentos passados.

for arg in $*
do
    ps -o pid,pcpu,cmd -C $arg
done

ligue para ele assim:

./test.sh command1 command2 command3 command4 command5 command6

e executará o comando ps com cada argumento.

    
por 13.08.2010 / 11:43