Come inoltro i parametri ad altri comandi nello script bash?


165

All'interno del mio script bash, vorrei analizzare zero, uno o due parametri (lo script può riconoscerli), quindi inoltrare i parametri rimanenti a un comando invocato nello script. Come lo posso fare?

Risposte:


239

Utilizzare il shiftcomando integrato per "mangiare" gli argomenti. Quindi chiama il processo figlio e passagli l' "$@"argomento per includere tutti gli argomenti rimanenti. Si noti che le virgolette devono essere mantenute, poiché causano la corretta quotazione dell'espansione dell'elenco degli argomenti.


23
in realtà "$ @" è più sicuro di $ *
pixelbeat

1
@pixelbeat: grazie, ottima cattura. Ho modificato. @ Łukasz Lew: vedere la pagina collegata al manuale. :) Fondamentalmente, gestisce meglio la quotazione.
Rilassati l'

22
$@tratta essenzialmente ogni elemento dell'array come una stringa tra virgolette: vengono passati senza possibilità di espansione. Assicura inoltre che ognuno sia visto come una parola separata. Questa spiegazione insieme a uno script di prova che dimostra la differenza è qui: tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel

2
Fai attenzione alle citazioni! Per saperne di più sul perché è qui in giro importante: stackoverflow.com/a/4824637/4575793
Cadoiz

32

bash usa il comando shift :

ad es. shifttest.sh:

#!/bin/bash
echo $1
shift
echo $1 $2

shifttest.sh 1 2 3 produce

1
2 3

2
@ TamásZahola cura di spiegare?
Kyle Chadha,

2
Se inoltri gli argomenti come $1senza citarli come "$1", allora la shell eseguirà la divisione delle parole, quindi ad esempio foo barverrà inoltrata come fooe barseparatamente.
Tamás Zahola,

Per saperne di più sul motivo per cui è importante avere il doppio "da queste parti: stackoverflow.com/a/4824637/4575793
Cadoiz

1
Il mio cervello ha confuso un paio di lettere in "shifttest" e di conseguenza l'ho letto come qualcos'altro.
Alex,

21

Bash supporta i parametri di subsetting (consultare Sottoinsiemi e sottostringhe ), quindi puoi scegliere quali parametri elaborare / passare in questo modo.

  1. apri il nuovo file e modificalo: vim r.sh:

    echo "params only 2    : ${@:2:1}"
    echo "params 2 and 3   : ${@:2:2}"
    echo "params all from 2: ${@:2:99}"
    echo "params all from 2: ${@:2}"
  2. eseguirlo:

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
  3. il risultato è:

    params only 2    : 2
    params 2 and 3   : 2 3
    params all from 2: 2 3 4 5 6 7 8 9 10
    params all from 2: 2 3 4 5 6 7 8 9 10
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.