Tengo una simple secuencia de comandos donde el primer argumento es reservado para el nombre de archivo, y todos los otros argumentos opcionales deberán ser transmitidos a otras partes de la secuencia de comandos.

Través de Google he encontrado esta wiki, pero fue una literal ejemplo:

echo "${@: -1}"

Yo puedo conseguir otra cosa que trabajar, como:

echo "${@:2}"

o

echo "${@:2,1}"

Me sale «Mal de sustitución» de la terminal.

¿Cuál es el problema y cómo puedo proceso de todos, pero el primer argumento pasado a un script en bash?

  • Para llamar a alguien más confundido, el mal shebang fue proporcionada causando "{@:2}" para no trabajar, por lo que la respuesta correcta partidos anteriores.
  • Usted acaba de usar shell predeterminado, que es el dash de Ubuntu y muchas otras Linuxes. En el tablero de «${@: -1}» se interpreta como: {parámetro: palabra} – Usar los Valores Predeterminados, y el uso de la palabra si el parámetro no está definido o nulo. Así, en el guión «${@: -1}» resultados exactamente el mismo como «[email protected]». Para usar bash solo uso la primera línea siguiente en el archivo de script: #!/bin/bash
InformationsquelleAutor theta | 2012-01-29

3 Comentarios

  1. 565

    Usar este:

    echo "${@:2}"

    La siguiente sintaxis:

    echo "${*:2}"

    iba a funcionar así, pero no es recomendable, porque como @Gordon ya se ha explicado, que el uso de *, se ejecuta todos los argumentos juntos como un solo argumento con espacios, mientras que @ conserva los descansos entre ellos (incluso si algunos de los argumentos en los mismos espacios). Esto no hace la diferencia con echo, pero lo que importa para muchos otros comandos.

    • Me di cuenta de mi proceso fue malo: #!/usr/bin/env sh por Eso he tenido problemas. Ejemplo funciona bien, igual que siempre, después me quitó el shebang
    • Uso "${@:2}" lugar — el uso de * ejecuta todos los argumentos juntos como un solo argumento con espacios, mientras que @ conserva los descansos entre ellos (incluso si algunos de los argumentos en los mismos espacios). La diferencia no se nota con echo, pero lo que importa para muchas otras cosas.
    • El punto aquí es ejecutar los argumentos juntos. Estábamos pasando los nombres de archivo, usted estaría en lo correcto. echo es perdonar lo suficiente como para concatenar para usted; otros comandos pueden no ser tan agradable. No sólo tiene que utilizar uno o el otro: aprender la diferencia entre * y @, y cuándo usar cada uno. Usted debe ser el uso de ellos por igual. Un buen ejemplo de cuando esto va a ser un problema: si $3 contiene un salto de línea (\n), será reemplazado con un espacio, siempre y cuando usted tiene un defecto de $IFS variable.
    • Como yo lo entiendo, la pregunta era cómo pasar a todos, pero el primer argumento de «a la otra parte de la secuencia de comandos», con echo utiliza tan sólo como un ejemplo, en cuyo caso se debe no ejecutar juntos. En mi experiencia, las situaciones donde se desea ejecutar en conjunto son poco frecuentes (ver esta pregunta para un ejemplo), y "[email protected]" es casi siempre lo que quiere. También, el problema que mencionas con un salto de línea sólo se produce si [email protected] (o $*) no está en comillas dobles.
    • Hmm… tienes razón, ahora que me pongo a pensar; el salto de línea no debería ser un problema. Debo de haber estado pensando en algo más. Sin embargo, todavía tengo que estar en desacuerdo acerca de la ejecución de juntas; necesito usar $* muy a menudo en mis guiones.
    • FWIW, el Google Shell Guía de Estilo dice que "[email protected]" es de la derecha casi cada vez, y $* está mal casi siempre. Hay más información ¿por qué en la guía de estilo.
    • ¿Cuál es el nombre de esta sintaxis?
    • Es el «parámetro de desplazamiento:» sintaxis descrita aquí.

  2. 163

    Si quieres una solución que funciona también en /bin/sh intentar

    first_arg="$1"
    shift
    echo First argument: "$first_arg"
    echo Remaining arguments: "[email protected]"

    shift [n] cambios de los parámetros de posición n veces. Un shift establece el valor de $1 para el valor de $2, el valor de $2 para el valor de $3, y así sucesivamente, disminuyendo el valor de $# por uno.

    • +1: Usted probablemente debería guardar $1 a una variable antes de pasar a la basura.
    • Sorprendentemente foo=shift no hacer lo que yo esperaría.
    • Sé que esto es viejo, pero trate de foo=$(shift)
    • Que no funciona por 2 razones: 1) shift (en cáscara) no tiene ninguna salida. Simplemente descarta $1 y cambia todo. 2) $(...) inicia una subshell, que tiene su propio local de argumentos. Cambia los argumentos en la subshell, que no afecta a los padres

Dejar respuesta

Please enter your comment!
Please enter your name here