Como escrever um script de shell que fará uma correspondência de substring que não diferencia maiúsculas de minúsculas da saída do comando?
shell-script
shell
string
Miguel Roque
fonte
fonte
grep -i
talvez?bash
, que é um superconjunto do padrão unixsh
. Você pode começar olhando para um destes: | 1 | 2 - apenas para entender o contexto atual.Respostas:
Primeiro, aqui está um exemplo de script simples que não ignora maiúsculas e minúsculas:
Tente alterar o hello da string à direita, e ele não deve mais ecoar
it works
. Tente substituirecho hello
por um comando de sua escolha. Se você deseja ignorar maiúsculas e minúsculas e nenhuma string contém uma quebra de linha, você pode usar grep:A chave aqui é para a qual você está canalizando uma saída de comando
grep
. Aif
instrução testa o status de saída do comando mais à direita em um pipeline - nesse caso, grep. O Grep sai com sucesso se, e somente se, encontrar uma correspondência.A
-i
opção do grep diz para ignorar maiúsculas e minúsculas.A
-q
opção diz para não emitir saída e sair após a primeira partida.A
-F
opção diz para tratar o argumento como uma string em vez de uma expressão regular.Observe que o primeiro exemplo usa o que permite comparações diretas e vários operadores úteis. A segunda forma apenas executa comandos e testa seu status de saída.
[ expression ]
fonte
==
não é POSIX.sh
não estábash
em todos os sistemas baseados em Linux.==
não é suportado porash
(sobre o qualsh
se baseia pelo menos muitos dos BSDs e derivados do Debian), ouposh
, e precisa ser citado emzsh
. Não faz sentido dobrar o=
.[
é um comando para teste. Não há necessidade de desambiguar entre atribuição e comparação aqui. Isso é diferente em(( a == b ))
vs(( a = b))
. O uso==
de um script que começa com#! /bin/sh
está errado. Se você assumirksh
oubash
sintaxe, atualize-o de#!
acordo.É possível fazer a correspondência de substring sem distinção entre maiúsculas e minúsculas
bash
usando o operador regex=~
se você definir anocasematch
opção shell. Por exemplofonte
[[ XYZ == xyz ]] && echo "match"
=>match
Para uma pesquisa de cadeia que diferencia maiúsculas de minúsculas do valor da variável
needle
no valor da variávelhaystack
:Para uma pesquisa de cadeias sem distinção entre maiúsculas e minúsculas, converta ambas para o mesmo caso.
Observe que o
tr
coreutils no GNU não suporta localidades multibyte (por exemplo, UTF-8). Para trabalhar com códigos de idioma multibyte, use o awk. Se você usar o awk, poderá fazer a comparação de cadeias e não apenas a conversão.O
tr
BusyBox não suporta a sintaxe; você pode usar em seu lugar. O BusyBox não suporta localidades não ASCII.[:CLASS:]
tr a-z A-Z
No bash (mas não sh), versão 4.0+, há uma sintaxe interna para conversão de maiúsculas e minúsculas e uma sintaxe mais simples para correspondência de cadeias.
fonte
printf | tr
faz minha cabeça girar. Sempre que possível, mantenha sua chamada de comandos no mínimo ... dada uma variável v, você pode realizar a mesma coisa usandov=$(tr '[:lower:]' '[:upper:]' <<<$v)
. Para aqueles que nunca viram isso antes, a<<<
é essencialmente uma "variável aqui", como o uso de<<EOF
é para um documento aqui. Não faça issoprintf
ou aecho
menos que você absolutamente precise fazê-lo.<<<
operador: ksh, bash, zsh, mas não sh simples. E está muito próximo de ser canalizadoprintf
em termos de como é executado: há o mesmo número de chamadas parafork
eexecve
(supondo queprintf
esteja embutido, como é o caso dos shells mais comuns); uma diferença é que<<<
cria um arquivo temporário em vez de usar um pipe.<<<
É conveniente digitar, mas não uma melhoria de desempenho.