2011-03-23 23 views

Respuesta

1
if [ `set | grep '^VAR=$'` ] 

Esto busca la cadena "var =" en la lista de variables establecidas.

+0

No sé quién te vote, pero tu solución me funciona. – green69

+0

Respondí la pregunta incorrecta la primera vez. Aquí hay una respuesta corregida. –

+1

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

28

${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 
+3

sólo para redondear esta respuesta se puede agregar que '-' funciona de la manera opuesta, es decir,' $ {foo unset} 'produce 'unset' si foo está desarmado. esto es útil para secuencias de comandos en ejecución en seco, p. 'rsync -avuz $ {DRYRUN --- dry-run} $ HOME/blog/webserver: blog /' que debe ejecutarse como 'DRYRUN = upblog.sh' para realmente realizar la carga. –

+1

Esta debería ser la respuesta aceptada. Respuesta editada para incluir el excelente comentario de @ jcomeau_ictx. – dev

0

bueno, aquí es una manera ocurrirá

$ s="" 
$ declare -p s 
declare -- s="" 
$ unset s 
$ declare -p s 
bash: declare: s: not found 

un mensaje de error si la variable no está definida.

+0

La pregunta original era cómo distinguir entre las variables que se configuran en la cadena vacía versus las variables que no están establecidas en absoluto. Esto devuelve un espacio en blanco para ambos casos. –

+0

sí, entendí mal la pregunta. ver mi edición – kurumi

0

Puede probar con

[ -v name ]

nombre es sin signo $

+0

No puedo encontrar esto en Bash v3.2.57 (1) o v4.1.5 (1). ¿Para qué caparazón es esto? – tripleee

+0

mi versión de bash shell es 4.3 en ubuntu 15.10. compruebe con el comando "help test" si existe el operador "-v". en realidad hay dos comandos de prueba uno es shell incorporado y el otro es/usr/bin/test – mug896

Cuestiones relacionadas