2010-07-01 2 views
1

Я хочу передать много аргументов сценарию оболочки, который не знает, сколько аргументов они будут, и я хочу обработать их. Я сделал следующий код:Прокрутите массив аргументов, не зная, сколько аргументов в сценарии оболочки?

int=$1 
src=$2 

r=$3 
string=$4 

duration=$5 

./start.sh $int $r $src "$string" 
sleep $duration 

shift; shift; shift; shift; shift 

while [ $# -gt 2 ] 
do 
    r=$1 
    string=$2 
    duration=$3 
    ./change.sh $int $r "$string" 
    sleep $duration 
    shift; shift; shift 
done 

Это работает, но только один раз, теперь я хочу этот скрипт для запуска все время, я имею в виду, используя while 1, но это не будет работать так, потому что список аргументов пуст в конце этого кода!

Есть ли способ сделать что-то вроде следующего «псевдо-код» в скриптах:

for(i=0 ; i<arguments.count; i++){ 
    //do something with arguments[i] 
} 

или скопировать массив аргументов в другой массив, так что я могу использовать его в дальнейшем, как я хочу. Я имею в виду, могу ли я скопировать $* или [email protected] или arg в другой массив?

Любая помощь очень ценится.

ответ

3

Число аргументов хранится в параметре #, к которому можно получить доступ с помощью $#.

Простой цикл по всем аргументам можно записать следующим образом:

for arg 
do 
    # do something with the argument "arg" 
done 
+0

Могу ли я использовать что-то вроде '$ arg [i]'? – Reem

+0

Да, '' $ {arg [$ i]} "' (обратите внимание на кавычки и фигурные скобки). – Philipp

+0

'i = 1; echo "$ {arg [$ i]}" ' ничего не напечатал :( – Reem

0

Вы можете использовать $#, чтобы получить количество аргументов, переданных скрипту, или [email protected], чтобы получить список всех аргументов.

0
declare -a array_list 
index=0 
for arg 
do 
    array_list[$index]=$arg 
    echo ${array_list[$index]} #just to make sure it is copied :) 
    ((index++)) 
done 

Сейчас я использую array_list делать все, что я хочу со списком аргументов. Thanks

Смежные вопросы