Cada aplicativo é livre para interpretar uma variável não definida e uma variável vazia da mesma maneira ou não. Geralmente, é uma má ideia dar a eles diferentes significados, e a maioria dos aplicativos não faz isso, mas acontece.
Um exemplo em shells é a variável de shell IFS (que é geralmente não exportados no ambiente, mas o mesmo princípio se aplica). Se não definido, o shell se comporta como se o valor fosse $' \t\n' .
Em um script de shell, $foo se expande para uma sequência vazia, seja foo definido como vazio ou não definido. Você pode executar o shell na configuração nounset ( set -u ou set -o nounset ) , caso em que o shell reporta um erro e sai se você tentar expandir uma variável não definida. Caso contrário, você pode distinguir entre variáveis não definidas e vazias com os modificadores expansão de parâmetros : ${foo:+a} expande para a se foo não estiver definido ou vazio e para a sequência vazia, caso contrário, enquanto ${foo+a} expande para a mesmo se foo estiver definido para a cadeia vazia.