Como a expansão da variável não foi citada, a palavra vazia resultante de $varsome
sendo expandida é removida completamente.
Vamos criar uma função que imprima o número de argumentos obtidos e compare o caso citado e não citado:
$ args() { echo "got $# arguments"; }
$ var=""
$ args $var
got 0 arguments
$ args "$var"
got 1 arguments
O mesmo acontece no seu caso com id
: id -u $var
é exatamente o mesmo que id -u
quando var
está vazio. Como id
não vê um nome de usuário, ele por padrão imprime as informações do usuário atual.
Se você citar "$var"
, o resultado será diferente:
$ var=""
$ id -u "$var"
id: ‘’: no such user
Com isso corrigido, você pode usar id
para descobrir se um usuário existe. (Não precisamos das saídas aqui, portanto, redirecione-as.)
check_user() {
if id -u "$1" >/dev/null 2>&1; then
echo "user '$1' exists"
else
echo "user '$1' does not exist"
fi
}
check_user root
check_user asdfghjkl
Isso imprimiria user 'root' exists
e user 'asdfghjkl' does not exist
.
Isso é um pouco do inverso dos problemas usuais que surgem da divisão inesperada de palavras de variáveis não citadas. Mas a questão básica é a mesma e fixada por meio que as respostas aqui dizem: sempre cite as expansões variáveis (a menos que você saiba que quer o comportamento não cotado).
Veja: