Ricerca…


Osservazioni

  • shift sposta i parametri posizionali a sinistra in modo che $2 diventi $1 , $3 diventi $2 e così via.
  • "$@" è una matrice di tutti i parametri posizionali passati allo script / funzione.
  • "$*" è una stringa composta da tutti i parametri posizionali passati allo script / funzione.

Analisi dei parametri multipli

Per analizzare molti parametri, il modo migliore per farlo è utilizzare un ciclo while , un'istruzione case e lo shift .

shift è usato per far scattare il primo parametro della serie, facendo quello che era $ 2 , ora $ 1 . Questo è utile per elaborare gli argomenti uno alla volta.

#!/bin/bash

# Load the user defined parameters
while [[ $# > 0 ]]
do
        case "$1" in

                -a|--valueA)
                        valA="$2"
                        shift
                        ;;

                -b|--valueB)
                        valB="$2"
                        shift
                        ;;

                --help|*)
                        echo "Usage:"
                        echo "    --valueA \"value\""
                        echo "    --valueB \"value\""
                        echo "    --help"
                        exit 1
                        ;;
        esac
        shift
done

echo "A: $valA"
echo "B: $valB"

Ingressi e uscite

$ ./multipleParams.sh --help
Usage:
    --valueA "value"
    --valueB "value"
    --help

$ ./multipleParams.sh
A: 
B:

$ ./multipleParams.sh --valueB 2
A: 
B: 2

$ ./multipleParams.sh --valueB 2 --valueA "hello world"
A: hello world
B: 2

Accesso ai parametri

Quando si esegue uno script Bash, i parametri passati nello script vengono denominati in base alla loro posizione: $1 è il nome del primo parametro, $2 è il nome del secondo parametro e così via.

Un parametro mancante valuta semplicemente una stringa vuota. Il controllo dell'esistenza di un parametro può essere eseguito come segue:

if [ -z "$1" ]; then
    echo "No argument supplied"
fi

Ottenere tutti i parametri

$@ e $* sono modi di interagire con tutti i parametri dello script. Facendo riferimento alla pagina man di Bash , vediamo che:

  • $* : Si espande ai parametri posizionali, a partire da uno. Quando l'espansione avviene tra virgolette doppie, si espande in una singola parola con il valore di ciascun parametro separato dal primo carattere della variabile speciale IFS.
  • $@ : Si espande ai parametri posizionali, a partire da uno. Quando l'espansione avviene tra virgolette doppie, ciascun parametro si espande in una parola separata.

Ottenere il numero di parametri

$# ottiene il numero di parametri passati in uno script. Un tipico caso d'uso sarebbe quello di verificare se il numero appropriato di argomenti è passato:

if [ $# -eq 0 ]; then
    echo "No arguments supplied"
fi

Esempio 1

Passa in rassegna tutti gli argomenti e controlla se sono file:

for item in "$@"
do  
    if [[ -f $item ]]; then
        echo "$item is a file"
    fi  
done

Esempio 2

Passa in rassegna tutti gli argomenti e controlla se sono file:

for (( i = 1; i <= $#; ++ i ))
do
    item=${@:$i:1}

    if [[ -f $item ]]; then
        echo "$item is a file"
    fi  
done

Analisi degli argomenti usando un ciclo for

Un semplice esempio che fornisce le opzioni:

Optare Alt. Optare Dettagli
-h --help Mostra aiuto
-v --version Mostra informazioni sulla versione
-dr path --doc-root path Un'opzione che accetta un parametro secondario (un percorso)
-i --install Un'opzione booleana (vero / falso)
-* - Opzione non valida
#!/bin/bash
dr=''
install=false

skip=false
for op in "$@";do
    if $skip;then skip=false;continue;fi
    case "$op" in
        -v|--version)
            echo "$ver_info"
            shift
            exit 0
            ;;
        -h|--help)
            echo "$help"
            shift
            exit 0
            ;;
        -dr|--doc-root)
            shift
            if [[ "$1" != "" ]]; then
                dr="${1/%\//}"
                shift
                skip=true
            else
                echo "E: Arg missing for -dr option"
                exit 1
            fi
            ;;
        -i|--install)
            install=true
            shift
            ;;
        -*)
            echo "E: Invalid option: $1"
            shift
            exit 1
            ;;
    esac
done

Script wrapper

Lo script wrapper è uno script che include un altro script o comando per fornire funzionalità aggiuntive o semplicemente per rendere meno noioso qualcosa.

Ad esempio, l'attuale egrep nel nuovo sistema GNU / Linux viene sostituito da uno script wrapper chiamato egrep . Ecco come appare:

#!/bin/sh
exec grep -E "$@"

Quindi, quando esegui egrep in tali sistemi, stai eseguendo grep -E con tutti gli argomenti inoltrati.

Nel caso generale, se si desidera eseguire un esempio di script / comando exmp con un altro script mexmp quindi l'involucro mexmp sceneggiatura sarà simile:

#!/bin/sh
exmp "$@" # Add other options before "$@"
# or 
#full/path/to/exmp "$@"

Dividi la stringa in una matrice in Bash

Diciamo che abbiamo un parametro String e vogliamo dividerlo con una virgola

my_param="foo,bar,bash"

Per dividere questa stringa con una virgola possiamo usare;

IFS=',' read -r -a array <<< "$my_param"

Qui, IFS è una variabile speciale denominata Separatore di campo interno che definisce il carattere oi caratteri utilizzati per separare un modello in token per alcune operazioni.

Per accedere a un singolo elemento:

echo "${array[0]}"

Per scorrere gli elementi:

for element in "${array[@]}"
do
    echo "$element"
done

Per ottenere sia l'indice che il valore:

for index in "${!array[@]}"
do
    echo "$index ${array[index]}"
done


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow