¿Qué hace un signo de dólar seguido por un signo (@) media en una secuencia de comandos de shell?

Por ejemplo:

umbrella_corp_options [email protected]
InformationsquelleAutor trusktr | 2012-04-03

5 Comentarios

  1. 202

    [email protected] es todos de los parámetros pasados al script.

    Por ejemplo, si se llama ./someScript.sh foo bar luego [email protected] será igual a foo bar.

    Si usted:

    ./someScript.sh foo bar

    y, a continuación, en el interior de someScript.sh referencia:

    umbrella_corp_options "[email protected]"

    se pasará a umbrella_corp_options con cada parámetro entre comillas dobles, que permiten tomar los parámetros con espacio en blanco de la persona que llama y se las pasan.

  2. 89

    [email protected] es casi el mismo como $*, ambos con el significado de «todos los argumentos de línea de comandos». A menudo se utilizan simplemente para pasar todos los argumentos a otro programa (por lo tanto la formación de una envoltura alrededor de otro programa).

    La diferencia entre las dos sintaxis se muestra cuando usted tiene un argumento con espacios (por ejemplo) y poner [email protected] comillas dobles:

    wrappedProgram "[email protected]"
    # ^^^ this is correct and will hand over all arguments in the way
    #     we received them, i. e. as several arguments, each of them
    #     containing all the spaces and other uglinesses they have.
    wrappedProgram "$*"
    # ^^^ this will hand over exactly one argument, containing all
    #     original arguments, separated by single spaces.
    wrappedProgram $*
    # ^^^ this will join all arguments by single spaces as well and
    #     will then split the string as the shell does on the command
    #     line, thus it will split an argument containing spaces into
    #     several arguments.

    Ejemplo: Llamar A

    wrapper "one two    three" four five "six seven"

    resultará en:

    "[email protected]": wrappedProgram "one two    three" four five "six seven"
    "$*": wrappedProgram "one two    three four five six seven"
                                 ^^^^ These spaces are part of the first
                                      argument and are not changed.
    $*:   wrappedProgram one two three four five six seven
    • Ellos son no de la misma, y el manual es claro sobre los efectos secundarios de $ * * * uso de IFS—que no es necesariamente el espacio. (Si fueran lo mismo, no habría ningún punto, aparte de la compatibilidad quizás, en la oferta de ambos).
    • No, no lo son. Y me lo dijo dos líneas más abajo: «La diferencia entre los dos …» con el fin De obtener frases cortas y aumentar la legibilidad, el lector tiene que leer más de una oración antes de dar un veredicto :-/
    • Alfe, Christoffer la inserción de una palabra «casi» hecho un infierno de una diferencia, sin sacrificar la sequedad o la legibilidad. De hecho, yo upvoted esta respuesta (en oposición a la aceptación de uno) exactamente debido a que la sutil énfasis de la diferencia… — antes de darse cuenta de que era casi en contra de su voluntad! 😉
    • Creo que la palabra que se hizo un infierno de una diferencia para las personas que dan un veredicto justo después de leer la primera frase 😉 y lo que nunca fue en contra de mi voluntad. Realmente me gustaría escribir también para estas personas.
    • Muy claro. wrappedProgram "$*" -> separated by single spaces. pero en el 2º ejemplo que no se separan por espacios.
    • Sí lo son. Pero el primer parámetro contiene múltiples espacios que son vírgenes. Voy a añadir este aspecto a mi texto.

  3. 30

    Estos son los argumentos de línea de comandos donde:

    [email protected] = almacena todos los argumentos en una lista de cadenas

    $* = almacena todos los argumentos como una sola cadena

    $# = almacena el número de argumentos

    • (La de arriba inexactitud mencionado por @iruvar era fijo.)
  4. 10

    El uso de un puro [email protected] significa en la mayoría de los casos «duele el programador tan duro como pueda», porque en la mayoría de los casos lleva a problemas con la palabra de separación y con los espacios y otros caracteres en los argumentos.

    En (adivinar) el 99% de todos los casos, es necesario encerrarlo en ": "[email protected]" es lo que puede ser utilizado de forma fiable iterar a través de los argumentos.

    for a in "[email protected]"; do something_with "$a"; done
    • La línea puede ser escrita como: para; hacer something_with «$a»; hecho 😉
    • Yo sé, solo me sombrero olvidado. Piense en ello como for a in start_token "[email protected]" end_token; do something_with "$a"; done 🙂
  5. 6

    Desde el manual:

    @

    Se expande a los parámetros de posición, a partir de una. Cuando se produce la expansión dentro de comillas dobles, cada parámetro se expande a una palabra separada. Es decir, «[email protected]» es equivalente a «$1» «$2» …. Si el doble citado, la expansión se produce dentro de una palabra, la expansión de la primer parámetro se une con la parte inicial de la palabra original, y la expansión de los últimos parámetro se unió con la última parte de la palabra original. Cuando no hay parámetros posicionales, «[email protected]» e [email protected] expanda a nada (es decir, se eliminan).

Dejar respuesta

Please enter your comment!
Please enter your name here