Existem as seguintes maneiras de verificar se uma variável está disponível ou não em um script de shell Linux/Unix
[ ! -z "${MYVARIABLE}" ]
OU
[ -n "${MYVARIABLE}" ]
OU
[[ ! -v MYVARIABLE ]]
Qual é a diferença entre esses três? Quando um deve ser preferido ao outro? Além disso, se tentarmos combiná-los, um erro será dado. Por exemplo, se dermos o seguinte código, ele funcionará bem
if [ ! -z "${PROFILEHOME}" ] && [ -n "${PROFILEHOME}" ];
then
echo "Profile home variable that is being used is $PROFILEHOME"
else
echo "Profile home is not set"
fi
Entretanto, se tentarmos executar o seguinte
if [[ ! -v MYVARIABLE ]] && [ ! -z "${PROFILEHOME}" ] && [ -n "${PROFILEHOME}" ];
then
echo "Profile home variable that is being used is $PROFILEHOME"
else
echo "Profile home is not set"
fi
então o script de shell retorna uma mensagem de erro, " [: -v: operador inesperado "
A diferença entre os operadores -z e -n que é dada aqui simplesmente afirma que -z é para verificar quando a string é nula, enquanto -n é para verificar se não é nula.
-v
sempre testa a existência de um parâmetro, esteja seu valor vazio ou não.-z
testa apenas se uma string está vazia ou não. Ele não sabe ou se importa com parâmetros;$x
apenas fornece a string para testar, e parâmetros não definidos sempre se expandem para a string vazia, assim como parâmetros vazios.-n
é o oposto de-z
, então[[ ! -n "$x" ]]
e[[ -z "$x" ]]
são equivalentes para o mesmo parâmetrox
, esteja ele definido ou não.Como os parâmetros não definidos se expandem para a string vazia,
[[ -v x ]]
successing não informa se[[ -z "$x" ]]
será bem-sucedido ou não, e[[ -z "$x" ]]
successing não informa se[[ -v x ]]
será bem-sucedido ou não.