2011-01-27 15 views
15

Przy pierwszych 9 argumentach skierowanych od 1-9 USD, 10 USD zostanie zinterpretowane jako 1 $, a następnie 0. Jak mam to uwzględnić i uzyskać dostęp do argumentów dla funkcji większych niż 10?Jak uzyskać dostęp do argumentów funkcji, jeśli istnieje więcej niż 9 argumentów?

Dzięki.

+0

Można zakładać przykładowy scenariusz gdzie to nie działa? Wierzę, że 10 USD powinno po prostu działać i zawierać 10. argument ... – sloth

+0

@dkson: nie. Jeśli nie używasz '{}' to rozważa 10 $ jako 1 $, a literał 0 – neuro

Odpowiedz

26

Zastosowanie:

#!/bin/bash 
echo ${10} 

Aby sprawdzić różnicę z $ 10 kod w foo.sh:

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

wówczas:

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

samo jest prawdziwe, jeśli masz :

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

Zastosowanie {} gdy chcesz usunąć niejasności ...

my2c

+1

Nie wiem co 'bash' _używasz, ale' $ 'jest chciwe:' $ foobar' da ci 42, _nie_ foobar. Jeśli chcesz '$ foo', po którym następuje literał' "bar" ', potrzebujesz' $ {foo} bar'. Nie odrzucę cię, ponieważ "prawdziwa" część twojej odpowiedzi jest poprawna, ale możesz chcieć naprawić (lub usunąć) błądzący bit. – paxdiablo

+0

@paxdiablo: tak, to był zły niesprawdzony (mój wstyd) przykład ... Dziękuję. – neuro

+0

To lepiej, więc +1. Skorzystałem z możliwości ustawienia "foo" na "FOO", ponieważ istniała możliwość pomyłki, mając na sobie zmienną nazwę i wartość. Mam nadzieję, że nie masz nic przeciwko. Twoje zdrowie. – paxdiablo

2

Ogólnie pewności, że cała dany ciąg jest używany do nazwy zmiennej podczas Bash interpretuje kod, ty trzeba zamknąć w nawiasach klamrowych: ${10}

4

Jeśli używasz bash, możesz użyć ${10}.

$ {...} składnia wydaje się być zgodny z POSIX, w tym konkretnym przypadku, ale może to być korzystne, aby użyć polecenia shift tak:

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

EDIT: Zauważyłem, że nie zrobił wyjaśnij, co robi shift. Po prostu przesuwa argumenty skryptu (lub funkcji). Przykład:

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

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

W przypadku może pomóc, tutaj jest przykład z 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

Prawdopodobnie chcesz '$ # -ne 0' zamiast' "$ *"! = "" ' –

+1

Nie trzeba używać' while' i 'shift' w niektórych przypadkach. Możesz użyć 'dla arg' lub' dla arg w "$ @" '. –

Powiązane problemy