No caso de test -e
por exemplo:
VAR="<this is a file path: /path/to/file/or/dir"
test -e $VAR && do_something || do_anotherthing
Pergunta: Devo usar "$VAR"
aqui?, aqui não gosto de verbose se não for necessário, porque $VAR
obviamente neste caso é um caminho, então se for uma string vazia, deve sempre falhar porque não há caminho que seja uma string vazia, então com minha lógica, aspas duplas não é necessário.
Mas no caso de teste de string, teste -n para exmpale:
VAR="<this is a string"
test -n $VAR && do_something || do_anotherthing
então com minha lógica, $VAR
deve ser colocado entre aspas duplas: "$VAR"
porque pode ser expandido para uma string vazia que se não estiver entre aspas duplas será expandida para -n
argumento apenas e sempre true.
Então, a questão real, por causa disso, estou em dúvida de que devemos usar apenas aspas duplas no comando test apenas com -n
e -z
contra strings?
Uma regra geral é colocar aspas duplas em qualquer variável, a menos que você queira que o shell execute a divisão de tokens e a expansão de curingas em seu conteúdo.
Ao contrário. O comportamento de
test -e
sem operandos é outro motivo pelo qual você deve citar a variável neste caso específico:Veja este Q&A , Greg's Wiki e o manual para explicações. tl;dr: não é nada óbvio como isso funciona, e você deveria usar mais citações™. Ou, para colocar de uma maneira diferente: se seus objetivos são correção e manutenção, citar corretamente é aproximadamente a prioridade 5 (depois de aprender todas as outras estranhezas necessárias para escrever scripts de shell corretos e concisos), enquanto salvar caracteres individuais é prioridade 999.999+.
Isso seria melhor, mais claro: