2011-01-27 18 views
15

Con i primi 9 argomenti che vengono inviati da $ 1- $ 9, $ 10 viene interpretato come $ 1 seguito da uno 0. Come faccio a tener conto di ciò e ad accedere agli argomenti per funzioni superiori a 10?Come accedere agli argomenti delle funzioni se ci sono più di 9 argomenti?

Grazie.

+0

Si potrebbe inserire uno script di esempio in cui questo non sta funzionando? Credo che $ 10 dovrebbero solo funzionare e contenere il decimo argomento ... – sloth

+0

@dkson: no. Se non usi '{}' considera $ 10 come $ 1 e la lettera litterale 0 – neuro

risposta

26

Usa:

#!/bin/bash 
echo ${10} 

Per testare la differenza con $ 10, codice foo.sh:

#!/bin/bash 
echo $10 
echo ${10} 

Poi:

$ ./foo.sh first 2 3 4 5 6 7 8 9 10 
first0 
10 

la stessa cosa che è vero se si dispone di :

foobar=42 
foo=FOO 
echo $foobar # echoes 42 
echo ${foo}bar # echoes FOObar 

Usa {} quando si desidera eliminare le ambiguità ...

MY2C

+1

Non so cosa 'bash'_ stai usando ma '$' è avido: '$ foobar' ti darà 42, _non_ foobar. Se vuoi '$ pippo' seguito dal letterale' "barra" ', hai bisogno di' $ {pippo} barra'. Non ti deriderò perché la parte "reale" della tua risposta è corretta, ma potresti voler correggere (o rimuovere) il bit offensivo. – paxdiablo

+0

@paxdiablo: sì, questo è stato un esempio non testato (mia vergogna) ... Grazie. – neuro

+0

Va meglio, quindi +1. Mi sono permesso di impostare 'foo' su' FOO' poiché c'era la possibilità che la confusione avesse lo stesso nome e valore della variabile. Spero non ti dispiaccia. Saluti. – paxdiablo

2

In generale, per essere sicuri che l'intera di una data stringa viene utilizzato per il nome variabile quando Bash è interpretare il codice, è necessario racchiuderlo tra parentesi: ${10}

4

Se si utilizza bash, è possibile utilizzare ${10}.

$ {...} sintassi sembra essere POSIX-compliant in questo caso particolare, ma potrebbe essere preferibile utilizzare il comando shift così:

 
while [ "$*" != "" ]; do 
    echo "Arg: $1" 
    shift 
done 

EDIT: ho notato che non ho spiegare cosa fa shift. Sposta semplicemente gli argomenti dello script (o funzione). Esempio:

 
> cat script.sh 
echo "$1" 
shift 
echo "$1" 

> ./script.sh "first arg" "second arg" 
first arg 
second arg 

Nel caso in cui si può aiutare, ecco un esempio con getopt/shift:

 
while getopts a:bc OPT; do 
case "$OPT" in 
    'a') 
    ADD=1 
    ADD_OPT="$OPTARG" 
    ;; 
    'b') 
    BULK=1 
    ;; 
    'c') 
    CHECK=1 
    ;; 
esac 
done 
shift $(expr $OPTIND - 1) 
FILE="$1" 
+3

Probabilmente vorrai '$ # -ne 0' invece di' "$ *"! = "" ' –

+1

In alcuni casi non è necessario usare' while' e 'shift'. Puoi usare 'for arg' o' for arg in "$ @" '. –

Problemi correlati