Digamos que temos 2 números inteiros em um script bash:
value1=5
value2=3
Então, por que precisamos usar aspas duplas no caso de um teste? Por exemplo:
if [[ "$value1" -eq "$value2" ]]
Por que não usar apenas o seguinte?
if [[ $value1 -eq $value2 ]]
Para mim, as aspas duplas não fazem sentido.
5
e3
, é a manutenção. Os valores podem mudar mais tarde e os erros resultantes podem não ser óbvios.[[ ]]
, apenas para[ ]
.[[ ]]
os operandos-eq
a inteiros.Respostas:
Divisão de palavras.
Este exemplo é muito improvável, mas possível ; portanto, se você quiser codificar defensivamente, cubra suas faixas com aspas:
Tudo bem, até agora. Vamos jogar a chave na engrenagem:
Opa
Ahh
fonte
[[ ]]
construção do bash .[ $value1 -eq $value2 ]
com um vaziovalue1
seria'[' -eq 3 ']'
sem''
no lado esquerdo.Você realmente não precisa das aspas aqui. Este é um dos poucos casos em que é seguro usar uma variável sem aspas. Você pode confirmar isso com
set -x
:Como você pode ver acima, as versões citadas e não citadas do teste são resolvidas exatamente da mesma maneira pelo bash. O mesmo deve ser verdade para
zsh
e, eu acho, para qualquer outro shell que suporte o[[ ]]
operador.Observe que este não é o caso dos mais portáteis
[ ]
:A
[ ]
construção, diferentemente da construção,[[ ]]
requer citação.Alguns links úteis para saber mais sobre quando e por que a citação é necessária:
fonte
declare -i var1=
é0
quando avaliado.-eq
é uma comparação aritmética , para que você possa deixar de$
fora (dentro[[ .. ]]
) e escrever[[ a -eq b ]]
. Com a comparação de strings, você precisa$
, é claro, de[[ $a = $b ]]
var1="afoob"; var2="a*b"; [[ $var1 = $var2 ]] && echo match
. Se você deseja usar os caracteres glob sem que eles atuem como glob em um contexto brilhante (como o[[ ]]
), é necessário citar sim.((...))
ou$((...)
. Parece funcionar, mas (velho rabugento, ative) eu não gosto.-eq
e amigos internos também[[ ]]
são contextos aritméticos. :) (Relacionado: Expansão automática de variáveis dentro do comando bash [[]] )Mesmo que as aspas duplas não sejam necessárias, os motivos para usá-las são:
value1
evalue2
são variáveis, e você pode não saber o que elas contêm. Caso contrário, você pode muito bem perguntar: "Por que se preocupar com as variáveis em vez de verificarif [[ 5 -eq 3 ]]
? Ou levá-lo ainda mais, por que se preocupar com oif
em tudo quando você já sabe que 5 não é igual a 3? Muitas vezes é melhor ficar na defensiva. (É verdade essa divisão de palavras não ocorrerá[[
, mas os casos em que a divisão de palavras não ocorre são raros. Novamente, veja o primeiro ponto.)fonte
Não está diretamente relacionado à sua pergunta, mas eu uso
quando eu comparo números, mas você também não precisa usar aspas.
fonte
if (( value1 == value2 )); then
. Em contextos aritméticos, você nem precisa do$
. Essa questão, no entanto, parece focar nas variáveis usadas nos[[ ... ]]
testes.Você está absolutamente certo!
A citação entre colchetes duplos não faz sentido, pelo menos nesse caso.
Mas como eu uso aspas duplas diariamente - especialmente para expressões com colchetes simples, passando argumentos para funções e scripts, além de atribuições de variáveis às vezes (o que é completamente inútil para delcarações simples) - acho que algumas pessoas, pelo menos, escreva aspas duplas em torno de expansões variáveis instintivamente .
Um benefício de fazer aspas duplas de forma consequente e compreensível - mas apenas como faz sentido - é que os colegas de trabalho que são novos no bash podem aprender a escrever scripts mais estáveis . Isso também acentua o fato de que a arte do processamento de dados com o bash é mais sobre a separação de fluxos de dados (incluindo variáveis) por separadores de campo e os canaliza através de filtros . Assim que seus blocos de dados estiverem separados do fluxo, mantenha-os juntos com aspas duplas!
Outro benefício poderia ser a melhor legibilidade de scripts bash com seqüências de caracteres entre aspas duplas dentro de um editor de realce de código .
fonte