Outros já notaram qual é o erro em seu código e sugeriram corretamente que, para seus dados iniciais de espaço reservado, um array seria a melhor opção de estrutura de dados, além de como dividir a string corretamente, etc.
Agora que sabemos qual é o seu comando real que você está analisando, podemos ser um pouco mais criativos com sugestões de melhoria.
O seguinte script pegará cada uma das linhas de saída do seu comando ps
e a lerá como dois bits delimitados por espaço. O corpo do loop produz os bits lidos de maneiras diferentes:
#!/bin/bash
ps -r -e -o pcpu=,comm= |
while IFS=' ' read -r pcpu comm; do
printf 'pcpu=%s,\tcomm=%s,\tbasename of comm=%s\n' \
"$pcpu" "$comm" "${comm##*/}"
done
Aqui, comm
manterá tudo após a primeira sequência de espaços na saída de ps
(os espaços iniciais, antes da primeira coluna, serão aparados).
Você pode obviamente inserir seu head -n 1
como parte do pipeline inicial, se desejar.
Observe que em alguns shells, incluindo bash
, o loop está sendo executado em um subshell, portanto, quaisquer variáveis criadas lá não estarão disponíveis após o término do pipeline. Existem duas soluções para isso em bash
:
- Ative a opção
lastpipe
shell no script comshopt -s lastpipe
ou -
Leia os dados no loop com uma substituição de processo:
while IFS=' ' read ... # ... done < <( ps ... )
Exemplo de execução:
$ bash script.sh
pcpu=0.0, comm=tmux, basename of comm=tmux
pcpu=0.0, comm=sh, basename of comm=sh
pcpu=0.0, comm=sh, basename of comm=sh
pcpu=0.0, comm=bash, basename of comm=bash
pcpu=0.0, comm=bash, basename of comm=bash
pcpu=0.0, comm=bash, basename of comm=bash
pcpu=0.0, comm=ps, basename of comm=ps
pcpu=0.0, comm=sh, basename of comm=sh