Variável correta análise e citando

Variável correta análise e citando

A citação incorreta no código -fonte original pode levar facilmente a bugs quando a entrada fornecida pelos usuários não é o esperado ou não uniforme. Com o tempo, quando os scripts do Bash mudam, um efeito colateral imprevisto de uma variável citada incorretamente pode levar a um bug, mesmo em código intocado. Isso é ainda mais importante para aplicativos relacionados à segurança que podem ser propensos a tentativas de hackers. Aprenda a fazer a citação e a análise/validação variável desde o início e evite muitos desses problemas! Vamos começar…

Nesta série de tutoriais, você aprenderá:

  • Como citar suas variáveis ​​de bash corretamente
  • As advertências e os resultados de citações incorretas
  • Como garantir os valores variáveis ​​são o que eles deveriam ser
  • Como verificar se há valores variáveis ​​vazios, numéricos e baseados em texto
Variável correta análise e citando

Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
Categoria Requisitos, convenções ou versão de software usada
Sistema Independente da distribuição Linux
Programas Linha de comando Bash, sistema baseado em Linux
Outro Qualquer utilidade que não esteja incluída no shell bash por padrão pode ser instalada usando sudo apt-get install utility-name (ou yum em vez de apt-get)
Convenções # - requer que o Linux -Commands seja executado com privilégios de raiz diretamente como usuário root ou por uso de sudo comando
$-exige que o Linux-Commands seja executado como um usuário não privilegiado regular

Exemplo 1: Cite essas variáveis!

A menos que você esteja trabalhando com valores numéricos, e mesmo nesse caso às vezes, é aconselhável sempre citar suas variáveis ​​baseadas em texto ao verificar a igualdade etc. Vejamos um exemplo:

$ Var1 = "A"; se [$ var1 == "A"]; Então eco!'; fi sim! $ Var1 =; se [$ var1 == "A"]; Então eco!'; FI BASH: [: ==: Operador unário esperado 


Primeiro, definimos VAR1 para o valor a e posteriormente verificado se VAR1 igualado a. Isso funcionou, e podemos pensar que nosso código está bem e deixá-lo como está dentro do nosso script. No entanto, algum tempo depois e após muitas mudanças de código, começamos a ver Bash: [: ==: Operador unário esperado - Uma mensagem um tanto enigmática nos dizendo que há algo errado com nosso código.

O motivo é mostrado no segundo exemplo. Se de alguma forma nossa variável estiver vazia, eu.e. falhou em ser definido corretamente (ou foi apagado desde a configuração), então seremos apresentados com um erro à medida que Bash lê efetivamente isso; Se [== "A"] que é uma afirmação que não faz muito sentido, e não consegue calcular.

Se citamos adequadamente nossa variável com citações duplas ("), isso não aconteceria:

$ Var1 =; se ["$ var1" == "A"]; Então eco!'; fi $ 

Desta vez, Bash leu a declaração como Se ["" == "A"] - uma declaração mais fácil para os olhos e o compilador de bash. Nenhuma saída é gerada como claramente uma sequência vazia não é igual à letra a.

Exemplo 2: levando a citação um pouco mais longe

Depois de trabalhar com o Bash há um tempo, você aprenderá alguns de seus idiomas de idioma. Um desses idioma é o - vamos chamá -lo de privilégio (e certamente é uma conveniência!) - Ser capaz de citar variáveis ​​numéricas, mesmo que uma operação numérica esteja sendo executada:

$ Var1 = 13; se ["$ var1" -eq 13]; Então eco!'; fi sim! $ Var1 = 7; se ["$ var1" -eq 13]; Então eco!'; fi 

Embora o VAR1 seja definido como um valor numérico, Bash aceitará o " citando em torno do var1 e produzem corretamente o resultado da instrução if usando o é igual (eu.e. -Eq) Operação de comparação.

No entanto, ainda não chegamos ao círculo completo, pois o seguinte ainda falha;

$ Var1 =; se ["$ var1" -eq 13]; Então eco!'; FI BASH: [:: Expressão inteira esperada 

Desta vez, é esperada uma expressão inteira, mas uma variável vazia (i.e. "" foi aprovado), e isso certamente não é numérico. Existe uma maneira de corrigir isso? Claro:

Exemplo 3: Verificação do comprimento zero

$ Var1 =; se [-n "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; fi $ var1 = 13; se [-n "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; fi sim! 

Aqui usamos uma pré-verificação para ver se a variável não tem um comprimento de zero usando a instrução condicional -n o que significa que A string não tem um comprimento de zero. Isso também pode ser trocado pelo contrário usando ! -z onde -z significa A string tem um comprimento de zero e a ! nega o mesmo, eu.e. reverte o resultado:

$ Var1 =; se [ ! -z "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; fi $ var1 = 13; se [ ! -z "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; fi sim! $ Var1 = 7; se [ ! -z "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; fi $ 


Nós também adicionamos o = 7 exemplo aqui para mostrar como o se A declaração funciona corretamente. Sempre teste o seu se Declarações e condições em uma variedade de situações, casos de uso e exceções genéricas (valores ruins, sem valor, valores ímpares, etc.) se você deseja garantir que seu código esteja livre de bugs.

Exemplo 4: uma verificação quase completa

Ainda há uma falha no último exemplo. Você pegou? Basicamente, se passarmos valores textuais para a string, ou se A declaração ainda falha:

$ Var1 = "A"; se [ ! -z "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; FI BASH: [: A: Expressão inteira esperada 

Isso pode ser superado usando uma subshell, grep, e algumas expressões regulares. Para obter mais informações sobre expressões regulares, consulte nossos regexps Bash para iniciantes com exemplos e Bash Regex avançado com exemplos de artigos. Para obter mais informações sobre as subs -grandes bash, consulte nossas subs -grandes do Linux para iniciantes com exemplos e sub -Shells avançados com exemplos de artigos.

A sintaxe não é muito complexa:

$ Var1 = 7; se ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; fi $ var1 = 13; se ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; fi sim! $ Var1 = "A"; se ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; fi $ 

Ótimo. Aqui verificamos o conteúdo de VAR1 para ser numérico usando um grep -o (apenas grep; eu.e. Grep apenas a parte correspondente pela sequência de pesquisa, que é neste caso uma expressão regular). Selecionamos qualquer caractere de número de 0-9 e isto Uma ou mais vezes (como indicado pelo \+ qualificador para o [0-9] faixa de seleção). Então, tentamos combinar isso Grep correspondeu apenas à parte texto contra a variável original. É o mesmo? Se sim, então nossa variável consiste em apenas números.

Quando expandimos nosso exterior se declaração um pouco para incluir um outro Cláusula que nos dirá se uma variável não é numérica e quando tentamos passar 'a' Como entrada, vemos que as várias entradas são analisadas corretamente;

$ Var1 = 7; se ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; else ecoar 'variável não numérica!'; fi $ var1 = 13; se ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; else ecoar 'variável não numérica!'; fi sim! $ Var1 = "A"; se ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; else ecoar 'variável não numérica!'; variável fi não numérica! 


Então agora temos uma linha perfeita para o nosso código, não? Não ... ainda estamos perdendo alguma coisa ... você vê o que?

Exemplo 5: uma verificação completa

Você viu o problema? Ainda não checamos uma variável vazia!

$ Var1 = "; se [" $ (echo "$ var1" | grep -o '[0-9] \+') "==" $ var1 "]; então se [" $ var1 "-eq 13]; então eco 'sim!'; fi; else ecoar 'variável não numérica!'; FI BASH: [:: Expressão inteira esperada 

Ai. Eu confio que agora você vê por que eu mencionei regularmente em meus artigos para sempre verificar suas criações de código de uma maneira ou de outra. Claro, Bash se presta a scripts rápidos e fáceis, mas se você quiser garantir que as coisas continuarão funcionando corretamente ao alterar seus scripts ou adicionar código extra, você deve garantir que seus testes, entradas e saídas sejam limpos e claramente definidos. A correção é fácil:

$ Var1 = "; se [ ! -z "$ var1" -a "$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; então se ["$ var1" -eq 13]; Então eco!'; fi; else ecoar 'variável não numérica!'; variável fi não numérica! 

Aqui, usando o punho se declaração, adicionamos uma condição adicional para variável VAR1 para não (!) ser uma variável de comprimento zero. Isso funciona bem, dada a configuração atual como a segunda parte do primeiro se a declaração ainda pode prosseguir independentemente do conteúdo de VAR1.

Conclusão

Neste artigo, analisamos como citar e analisar/avaliar corretamente as variáveis ​​e exploramos o quão complexo era escrever uma peça de verificação de variável perfeita do código Bash. Aprender a fazer essas coisas corretamente desde o início limitará bastante a quantidade de insetos possíveis que podem ser introduzidos por acidente.

Aproveite e dupla cite essas variáveis! 🙂

Tutoriais do Linux relacionados:

  • Lista das melhores ferramentas Kali Linux para testes de penetração e…
  • Manipulando a entrada do usuário em scripts bash
  • Loops aninhados em scripts de basquete
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Bash Regex avançado com exemplos
  • Tutorial de depuração do GDB para iniciantes
  • Mastering Bash Script Loops
  • Variáveis ​​de bash especiais com exemplos
  • Expressões regulares do Python com exemplos
  • Como usar as sub -mais de bases dentro das declarações if if