Comecei a aprender Bash há alguns dias.
Estou tentando obter um status de saída da grep
expressão em uma variável como esta:
check=grep -ci 'text' file.sh
e a saída que eu recebi é
No command '-ic' found
Devo fazê-lo com um comando de pipe?
bash
shell
command-line
grep
exit-status
omri gilhar
fonte
fonte
$?
logo após a conclusão do comando.Respostas:
Seu comando,
será interpretado pelo shell como "execute o comando
-ci
com os argumentostext
efile.sh
, e defina a variávelcheck
como o valorgrep
em seu ambiente".As lojas de shell o valor de saída de comando mais recentemente executado na variável
?
. Você pode atribuir seu valor a uma de suas próprias variáveis como esta:Se você deseja agir com base nesse valor, use sua
check
variável:ou você pode pular usando uma variável separada e ter que inspecionar
$?
todos juntos:(observe
-q
, ele instruigrep
a não produzir nada e a sair assim que algo corresponder; não estamos realmente interessados no que corresponde aqui)Ou, se você quiser "fazer as coisas" quando o padrão não for encontrado:
$?
Só é necessário salvar em outra variável se você precisar usá-la mais tarde, quando o valor em$?
tiver sido substituído, como emNo trecho de código acima,
$?
será substituído pelo resultado do[ "$err" -ne 0 ] && [ ! -d "$dir" ]
teste. Salvá-lo aqui é realmente necessário apenas se precisarmos exibi-lo e usá-lo comexit
.fonte
Sua pergunta não é 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 dogrep
comando. A maneira de fazer isso é executarAo executar um comando a partir de um shell, seu status de saída é disponibilizado através do parâmetro especial do shell
$?
,.Isso está documentado pelo POSIX (o padrão para sistemas operacionais do tipo Unix) em sua especificação para o shell e a implementação do Bash está documentada em Parâmetros especiais .
Como você é um novato, eu recomendo fortemente que você comece com um bom livro e / ou tutorial on-line para entender o básico. Recomendações de recursos externos são desencorajadas nos sites Stack Exchange, mas eu sugiro o Bash Guide de Lhunath e GreyCat .
fonte
Você disse ao bash para definir a variável
check=grep
no ambiente que ela passa para o comandomas
ci
não existe.Acredito que você pretendia incluir esse comando entre back-ticks ou entre parênteses precedidos por um cifrão, qualquer um dos quais atribuiria a contagem de quantas linhas 'texto' foi encontrado (sem distinção entre maiúsculas e minúsculas) no arquivo:
Agora
$check
deve ser 0 se não houver correspondências ou positivo se houver correspondências.fonte
Confuso por que usar -c ao verificar a saída? É usado para verificar quantas vezes algo corresponde - não se for bem sucedido ou não.
mas neste exemplo
Ele não produz nada, exceto um código de saída, que é ecoado. Essa é a saída que a verificação de variável usa. Eu também prefiro porque é uma única linha.
Você pode substituir --silent por -q. Eu o uso, pois você não está interessado na saída grep, apenas se funcionou ou não.
fonte
A maneira correta de atribuir a saída do comando grep a uma variável é como @ monty-hard mencionado:
No entanto, para atribuir o status de saída deste comando a uma variável, você deve usar o parâmetro shell
$?
logo após executar o comando, como mostrado abaixo:fonte