Como alguém extrai o status de saída de um comando em uma variável?

6

Eu comecei a aprender Bash há alguns dias.

Estou tentando obter um status de saída da expressão grep em uma variável como esta:

check=grep -ci 'text' file.sh

e a saída que recebi é

No command '-ic' found

Devo fazê-lo com um comando de pipe?

    
por omri gilhar 07.07.2016 / 10:07

5 respostas

17

O shell armazena o valor de saída do comando executado mais recentemente na variável ? . Você pode atribuir seu valor a uma de suas próprias variáveis assim:

grep -i 'PATTERN' file
check=$?

Se você quiser agir com base nesse valor, use sua variável check :

if [ "$check" -eq 0 ]; then
    # do things for success
else
    # do other things for failure
fi

ou você pode pular usando uma variável separada e ter que inspecionar $? todos juntos:

if grep -q -i 'pattern' file; then
  # do things (pattern was found)
else
  # do other things (pattern was not found)
fi

ou, se você quiser "fazer as coisas" quando o padrão não for encontrado :

if ! grep -q -i 'pattern' file; then
  # do things (pattern was not found)
fi

Salvar $? em outra variável só é necessário se você precisar usá-la posteriormente, quando o valor em $? tiver sido sobrescrito, como em

mkdir "$dir"
err=$?

if [ "$err" -ne 0 ] && [ ! -d "$dir" ]; then
    printf 'Error creating %s (error code %d)\n' "$dir" "$err" >&2
    exit "$err"
fi

No trecho de código acima, $? será substituído pelo resultado do teste [ "$err" -ne 0 ] && [ ! -d "$dir" ] . Salvá-lo aqui é realmente necessário apenas se precisarmos exibi-lo e usá-lo com exit .

    
por 07.07.2016 / 10:43
2

Sua pergunta não está clara, mas, com base no código que você enviou, parece que você deseja que a variável check armazene o status de saída do comando grep . A maneira de fazer isso é executar

grep -ci 'text' file.sh
check=$?

Ao executar um comando a partir de um shell, seu status de saída é disponibilizado através do parâmetro de shell especial, $? .

Isto é documentado pelo POSIX (o padrão para sistemas operacionais tipo Unix) em sua especificação para o shell e a implementação do Bash está documentada em Parâmetros especiais .

Como você é um novo aluno, recomendo enfaticamente que comece com um bom livro e / ou um tutorial on-line para aprender o básico. Recomendações de recursos externos são desencorajadas nos sites do Stack Exchange, mas eu sugiro Guia de Bash de Lhunath e GreyCat .

    
por 07.07.2016 / 10:35
2

Você disse ao bash para definir a variável check=grep no ambiente que ela passa para o comando

-ci 'text' file.sh

mas ci não existe.

Acredito que você pretendia incluir esse comando em retrocessos ou entre parênteses precedidos por um sinal de dólar, qualquer um dos quais atribuiria a contagem de quantas linhas de 'texto' foram encontradas (insensíveis a maiúsculas e minúsculas) no arquivo:

check='grep -ci 'text' file.sh'

check=$(grep -ci 'text' file.sh)

Agora, $check deve ser 0 se não houver correspondências ou positivo, se houver alguma correspondência.

    
por 07.07.2016 / 21:40
0

Confuso por usar o -c ao verificar a saída? É usado para verificar quantas vezes algo é correspondido - não se for bem-sucedido ou não.

   -c, --count
          Suppress normal output; instead print a count of matching  lines
          for  each  input  file.  With the -v, --invert-match option (see
          below), count non-matching lines.  (-c is specified by POSIX.)

mas neste exemplo

check="$(grep --silent -i 'text' file.sh; echo $?)"

Ele não produz nada, exceto um código de saída, que é então ecoado. Esta é a saída que a verificação de variáveis usa. Eu também prefiro porque é uma única linha.

Você pode substituir --silent por -q. Eu uso isso porque você não está interessado na saída do grep, apenas se funcionou ou não.

   -q, --quiet, --silent
          Quiet;  do  not  write  anything  to  standard   output.    Exit
          immediately  with  zero status if any match is found, even if an
          error was detected.  Also see the -s  or  --no-messages  option.
          (-q is specified by POSIX.)
$ check=$(echo test | grep -qi test; echo $?) # check variable is now set
$ echo $check
0
$ check=$(echo null | grep -qi test; echo $?)
$ echo $check
1
    
por 08.07.2016 / 04:03
0

A maneira correta de atribuir a saída do comando grep a uma variável é como @ monty-harder mention:

check='grep -ci 'text' file.sh'
check=$(grep -ci 'text' file.sh)

Apesar de atribuir o status de saída deste comando a uma variável, você deve usar o parâmetro de shell $? logo após executar o comando, conforme mostrado abaixo:

grep -ci 'text' file.sh
check=$?
echo $check
    
por 16.02.2018 / 18:37