Como copiar ou ler o valor de retorno (status de saída) do script AWK no script de shell (bash) a ser usado na instrução if para comparar

2

Eu quero ler os códigos de erro ou o status de saída do script awk no shell para usar na condição if para comparar o tratamento de erros meu script de shell é parecido com:

Meu script:

#!/bin/sh

awk -v CONFIG_SOURCE=Testfile1.txt -f test.awk

echo $?  # prints the error code '2' in this case, if the file is actually not available
recval =  $?

if ($recval == '$2') **//this condition statement doesn't seems to work.**
then 
echo "Some error"
fi

arquivo test.awk:

BEGIN {
   ignore_line = 0;
   if ( CONFIG_SOURCE == "" )
   {
      print "Error: Invalid embed source file.";
      exit 1
   }
   if ( 0 != system( "[ -f " CONFIG_SOURCE " ] " ) )
   {
      print "Error: Embed source file '" CONFIG_SOURCE "' does not exist."
      exit 2
   }
}

Portanto, se o arquivo não estiver disponível, ele retornará o status de saída '2', que eu posso fazer eco, mas como copiar o valor '2' ou o status de saída para alguma variável (recval) no shell )

    
por user68039 20.05.2014 / 14:26

3 respostas

4

Isso deve funcionar:

#!/bin/sh

awk -v CONFIG_SOURCE=Testfile1.txt -f test.awk

re=$?
echo "$re"

if [ "$re" -eq 2 ]; then
  echo >&2 "Some error"
fi

O problema no seu script foi o uso de echo $? antes de recval = $? . Com echo $? você imprimiu o valor de $? (o status de saída da última declaração), mas , então $? foi substituído de echo $? . O status de saída da última instrução foi, então, o status de saída de echo $? , provavelmente com 0.

    
por 20.05.2014 / 14:51
1

O $? contém o valor do código de saída do último último comando executado. Você também pode empilhar códigos de saída em uma declaração de caso.

#!/usr/bin/env bash

awk -v CONFIG_SOURCE=Testfile1.txt -f test.awk &> /dev/null

recval=$?

case $recval in
    0) echo "Exit code 0"
       ;;
    1) echo "Exit code 1"
       ;;
    2) echo "Exit code 2"
       ;;
esac
    
por 20.05.2014 / 15:08
1

Sua lógica básica está correta, mas sua sintaxe está errada.

  • As atribuições devem ser uma única palavra, você não pode colocar espaços ao redor do sinal de igual: recval = $? executa o comando recval com dois argumentos, = e o valor de $? .
  • Após o comando $? , o valor de $? é para o comando echo ; salvar $? para outra variável deve ser a primeira coisa que você faz. Para ver o que está fazendo um script de shell, imprima um rastreamento: adicione set -x no topo, logo abaixo da linha #! .
  • '$2' é uma cadeia de dois caracteres. Para o número 2, escreva 2 . Mas, para testar se houve um erro, teste se o status é diferente de zero: 2 é apenas um dos valores possíveis.
  • Existem várias maneiras de comparar inteiros, mas o que você escreveu não é um.
    • [ "$x" -eq "$y" ] (portável)
    • [[ $x -eq $y ]] (em ksh, bash, apenas zsh, mas não em /bin/sh )
    • ((x == y)) (em ksh93, bash, apenas zsh, mas não em /bin/sh )
  • As mensagens de erro vão para o erro padrão (descritor de arquivo 2), não para a saída padrão.
  • Se o awk falhar, seu script provavelmente retornará um status diferente de zero.

Aqui está um script corrigido:

#!/bin/sh
awk -v CONFIG_SOURCE=Testfile1.txt -f test.awk
awk_status=$?
if [ "$awk_status" -eq 2 ]; then
  echo 1>&2 "Additional information regarding the error message from awk just above"
  exit $awk_status
fi
    
por 21.05.2014 / 10:18