2011-01-27 9 views
15

İlk 9 argümanı $ 1-9 $ arasında gösteriliyorsa, $ 10, $ 1 ve onu 0 olarak yorumlanır. Bunu nasıl açıklarım ve 10'dan büyük işlevlere argümanlara erişirim?9'dan fazla argüman varsa, işlevlere argümanlara nasıl erişebilirim?

Teşekkürler.

+0

Bu çalışmayan bir örnek senaryosunu sonrası olabilir: o yardımcı olabilir durumunda

 > cat script.sh echo "$1" shift echo "$1" > ./script.sh "first arg" "second arg" first arg second arg 

, burada getopt/vardiya ile bir örnektir? Bence 10 dolar sadece çalışmalı ve 10'uncu argümana dahil olmalı ... – sloth

+0

@dkson: no. '{}' Kullanmıyorsanız, $ 10'u 1 $ ve litteral 0 – neuro

cevap

26

Kullanım: Sonra

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

:

#!/bin/bash 
echo ${10} 

foo.sh içinde 10 $, kod ile farkı test etmek için

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

aynı şey varsa doğrudur :

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

kullanılması Eğer belirsizlikler kaldırmak istediğiniz {} ... Genelde

my2c

+1

olarak düşünürüm, 'bash' _you'_ 'nu kullandığını bilmiyorum ama' $ 'açgözlü:' $ foobar' size 42, _not_ verecek filanca. Eğer 'foo' kelimesini ve ardından "bar" sözcüğünü istiyorsanız, "$ {foo} bar" 'a ihtiyacınız var demektir. Cevabınızın "gerçek" kısmının doğru olmasından dolayı sizi reddetmeyeceğim, ancak rahatsız edici bit'i düzeltmek (veya kaldırmak) isteyebilirsiniz. – paxdiablo

+0

@paxdiablo: evet, denenmemiş (utanç) bir örnek oldu ... Teşekkür ederim. – neuro

+0

Bu daha iyi, bu yüzden +1. Değişken adı ve değeri aynı olan karışıklık olasılığından dolayı 'foo'' FOO'ya ayarlama özgürlüğünü aldım. Umarım sakıncası yoktur. Şerefe. – paxdiablo

2

Bash kodu yorumlama zaman belirli bir dizeye tüm değişken adı için kullanıldığını güvenli olması için, sen

4

Bash kullanıyorsanız, ${10}'u kullanabilirsiniz.

$ {...} sözdizimi bu özel durumda POSIX uyumlu gibi görünüyor, ama böyle komutunu shift kullanılması tercih olabilir:

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

EDIT: Ben yapmadım fark shift'un ne yaptığını açıklayın. Sadece betiğin (veya fonksiyonun) argümanlarını değiştirir. Örnek:

 
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

Muhtemelen '$ * -ne 0' yerine' '$ * '' istiyoruz! =" " –

+1

Bazı durumlarda' while' ve 'shift' kullanmaya gerek yoktur. “$ @” 'De arg için' arg' veya 'için kullanabilirsiniz. –

İlgili konular