${var+set}
no sustituye nada si la variable no está configurada y set
si está configurada en cualquier elemento, incluida la cadena vacía. ${var:+set}
sustituye set
solo si la variable está configurada en una cadena no vacía. Puede usar esto para probar cualquiera de los casos:
if [ "${foo+set}" = set ]; then
# set, but may be empty
fi
if [ "${foo:+set}" = set ]; then
# set and nonempty
fi
if [ "${foo-unset}" = unset ]; then
# foo not set or foo contains the actual string 'unset'
# to avoid a potential false condition in the latter case,
# use [ "${foo+set}" != set ] instead
fi
if [ "${foo:-unset}" = unset ]; then
# foo not set or foo empty or foo contains the actual string 'unset'
fi
No sé quién te vote, pero tu solución me funciona. – green69
Respondí la pregunta incorrecta la primera vez. Aquí hay una respuesta corregida. –
Mi voto negativo es porque esto es unidiomático, torpe e ineficiente. El shell tiene una funcionalidad incorporada para esto; Además, tiene un [uso inútil de backticks] (http://www.iki.fi/era/unix/award.html#backticks) y aparentemente [una comprensión incompleta de lo que hace la sentencia 'if'] (http://stackoverflow.com/questions/36371221/bash-if-statement-too-many-arguments/36371520#36371520) – tripleee