usando o awk em um script bash com if

1

Estou fazendo um script no qual preciso testar uma string e, com base em seu resultado, decidirei se vou mais longe ou não.

O comando abaixo funciona bem (se a string começar com "Clean", ele imprimirá 1, caso contrário, 0).

echo | awk ' {print index("'"${task}"'", "Clean")}'

O que estou tentando fazer é usar o AWK com IF em um script BASH. Com base nesta postagem , fiz o seguinte:

idx=$(awk '{print index("'"${task}"'", "Clean")}')
echo $idx
if [ "$idx" == "0" ]; then
   echo hello
fi

Como eu disse, quando eu executo o script, ele imprime "0", mas o segundo "echo" não imprime nada, e é claro que o if também não funciona.

Alguém pode me ajudar?

TIA,

Bob

    
por Bob Rivers 17.11.2009 / 17:30

3 respostas

4

Awk é a solução errada aqui. Que tal:

if [[ "$task" =~ ^Clean ]]; then
  echo hello
fi

Há também um método de substituição sorrateira:

if [ "${task/#Clean/}" != "$task" ]; then
  echo hello
fi

Mas acho que isso é muito menos legível.

Chris acha que o caso é mais arrumado ... vamos tentar:

case $task in
  Clean*)
    echo hello
    ;;
esac

Meu senso estético diz "não com os sinos ligados", e mexer com a formatação ( Clean*) echo hello;; ou similar) não ajuda muito, IMAO. Se você quiser uma condicional, use um if , eu digo.

    
por 17.11.2009 / 17:38
0

A resposta da Womble é provavelmente o que eu gostaria, mas você também pode usar o grep:

if echo cleanarf | grep -qi '^clean'; then 
   echo foo
fi

Elimine a opção i para o grep, se quiser que seja sensível a maiúsculas e minúsculas (ou se não quiser insensitivo a maiúsculas e minúsculas :-p).

    
por 17.11.2009 / 17:56
0

No seu primeiro exemplo, você usa echo para fornecer awk com um arquivo ( stdin ), mas no seu script, não há arquivo para awk processar e ele "trava" aguardando entrada . Você poderia usar echo em sua atribuição de variável no $() , mas eu prefiro usar /dev/null para essa finalidade (ou seja, quando não houver um arquivo real para processar).

Para evitar citações inconvenientes, você pode usar a variável transmitindo com a opção -v para fornecer variáveis Bash a um script awk .

Você deve descobrir que isso funciona:

idx=$(awk -v task="$task" '{print index(task, "Clean")}' /dev/null)
echo $idx
if [ "$idx" == "0" ]; then
   echo hello
fi

Você provavelmente deve usar a sugestão do womble , já que não requer a criação de um processo separado.

    
por 17.11.2009 / 19:10