2008-09-30 8 views

Respuesta

13

'Pasas Hysterical', también conocidas como Razones Históricas.

La explicación de JesperE (o la página del manual Bash) es exacta por lo que hace:

Si $ 1 existe y no es una cadena vacía, entonces sustituir al citado lista de argumentos.

Hace unos 20 años, algunas variantes menores rotas de Bourne Shell sustituían una cadena vacía "" por "$ @" si no existían argumentos, en lugar del correcto, actual comportamiento de no sustituir nada. Si alguno de estos sistemas todavía está en uso está abierto a debate.

[Hmm: que la expansión no funcionaría correctamente para:

command '' arg2 arg3 ... 

En este contexto, la notación correcta es:

${1+"[email protected]"} 

Esto funciona correctamente si $ 1 es un argumento vacío o no. Así, alguien recordó la notación de forma incorrecta, la introducción accidental de un error]

+5

Ah ha. Sí, al menos según http://google.com/codesearch, la notación que mencionaste es mucho más común. Veo 191,000 resultados para $ {1 + "$ @"} (es decir, sin dos puntos) frente a 173 resultados para $ {1: + "$ @"}.Por supuesto, la cita de "man bash" tiene dos puntos. Entonces quizás usar el colon no es un error. . . –

+2

El colon es una prueba diferente: busca una cadena no vacía. Se usa con más frecuencia en conexión con un env var que debe tener un valor: $ {ENVVAR: + "- value = $ ENVVAR"} o lo que sea. Esto crea un argumento -value = any solo si ENVVAR se establece en una cadena no vacía. –

2

Desde la página de manual de bash:

${parameter:+word} 
      Use Alternate Value. If parameter is null or unset, nothing is 
      substituted, otherwise the expansion of word is substituted. 

Así, "[email protected]" se sustituye a menos $1 no está definido. No puedo ver por qué no pudieron haber usado "[email protected]".

+0

Por cierto: La página de manual de bash es realmente su amigo cuando se trata de cuestiones tales como esto. Probablemente sea la página de manual que uso con más frecuencia. – JesperE

+0

Tienes razón sobre 'man bash'. Lo siento, también encontré esa cita, pero no la incluí en mi pregunta. Estoy de acuerdo en que probablemente podrían haber usado "$ @", pero debe haber una razón para $ {1: + "$ @"}. . . tal vez lo descubramos. :) –

+0

Yo tampoco descartaría la programación vudú. ;-) – JesperE

2

Para citar a la parte pertinente de man bash por la información que Jonathan Leffler se hace referencia en su comentario:.

Cuando no se realiza la expansión de subcadena , las pruebas de bash para un parámetro que es unset o null; omitiendo los dos puntos resultados en una prueba solo para un parámetro que es unset.

(el énfasis es mío)

Cuestiones relacionadas