Estou usando o bash, versão:
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Fiz o seguinte script:
#!/usr/bin/bash
a=11
b=4
c=7+b
if [[ a -eq c ]]
then
echo "ok"
else
echo "not ok"
fi
Ele imprime "ok". Quando eu mudo a
para 10, ele imprime "não ok". Então eu tenho uma pergunta simples, do [[ ]]
e (( ))
makes "avaliação transitiva" (no meu exemplo, isso significaria c
primeiro avalia para 7+b
e então b
avalia para 4
e finalmente ele se torna 11
)?
Pergunto porque tenho uma "briga" séria com IAs (chatGPT, gemini, claude), onde dizem que esse tipo de avaliação não acontece, mas meus exemplos mostram o contrário (dizem que c
é avaliado para 7+b
, e como não é um número, o valor 0
é tomado)... Obrigado antecipadamente
Sim, o Bash avalia variáveis recursivamente em expressões aritméticas :
No entanto , Bash e outros shells sofrem de uma vulnerabilidade trivial de injeção de comando em aritmética devido a como eles também expandem substituições de comando. Portanto, não use entrada não confiável em aritmética (
$(( ))
,(( ))
ou[[ ]]
e todos os outros contextos que esperam uma expressão aritmética ) sem validação adequada:Veja: Implicações de segurança do uso de dados não higienizados na avaliação aritmética do Shell
Um ponto menor aqui é a avaliação na atribuição vs. avaliação na referência, ou seja, enquanto a diferença de
a
ec
é zero aqui:aqui não é zero
como o valor de
b
é avaliado quando a atribuiçãoc=7+b
é manipulada, e comob
não está definido, o valor padrão de zero é usado.Outros shells podem ou não fazer isso. Pelo menos ksh e zsh parecem agir de forma similar ao Bash, enquanto Dash (
/bin/sh
no Debian/Ubuntu) apenas dá um erro como "sh: 1: Número ilegal: 7+b".Note que acima, as variáveis precisam conter expressões completas que podem ser avaliadas individualmente. Se você usar
$var
, você pode colocar quaisquer pedaços quebrados nas variáveis, desde que o resultado acabe sendo uma expressão que pode ser avaliada. Por exemplo, isto é11 - (7+ 4)
: