Passare i parametri della riga di comando a un programma all'interno dello script della shell


15

Per quanto riguarda ./script.sh arg1 [arg2 arg3 ...], gli argomenti della riga di comando arg1, arg2, ... può essere ottenuto da $1, $2, ... Ma il numero di argomenti è NON fisso.

Nello script della shell, voglio passare gli argomenti a partire da arg2un programma,

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

Come potrei farlo dal momento che potrebbero esserci uno o più argomenti?

Risposte:


17

Il solito modo sarebbe di salvare una copia di arg1 ( "$1") e spostare i parametri di uno, in modo da poter fare riferimento all'intero elenco come "$@":

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

bash ha ovviamente un certo supporto dell'array, ma non è necessario per la domanda come posta.

Se anche arg1 è facoltativo, lo verifichi in questo modo:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi

Le doppie virgolette sono necessarie quando si utilizza $@?
Lee,

1
Le virgolette doppie $@indicano alla shell di virgolette doppie per ogni parametro (qualcosa di carino da fare se i parametri contengono caratteri interessanti come parentesi o asterischi). Se non ti interessa, $*funziona semplicemente ...
Thomas Dickey,

6
@Lee Sì, le doppie virgolette sono necessarie. Altrimenti, invece di passare attraverso l'elenco degli argomenti, ogni argomento viene suddiviso in spazi bianchi, quindi ogni pezzo viene interpretato come un modello jolly e, se il modello corrisponde, viene sostituito dall'elenco delle corrispondenze. In generale, parlando, sostituisci sempre due volte le sostituzioni delle variabili .
Gilles 'SO- smetti di essere malvagio' il

10

È possibile tagliare i parametri posizionali utilizzando l'espansione dei parametri. La sintassi è:

${parameter:offset:length}

Se lengthomesso, viene considerato fino all'ultimo valore.

Mentre passavi dal secondo all'ultimo argomento, devi:

${@:2}

Esempio:

$ foo() { echo "${@:2}" ;}

$ foo bar spam egg
spam egg
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.