2012-01-27 2 views
1

Я хотел бы передать все аргументы скрипта функции foo, и если первый аргумент равен something, передайте все остальные аргументы функции bar.Как удалить элемент в массиве Bash?

Я реализовал это так:

foo() { 
    if [ "$1" = 'something' ]; then 
    args=("[email protected]") 
    unset args[0] 
    bar $args 
    fi 
} 

foo [email protected] 

Это позволяет упростить это?

ответ

3

Да, используйте shift

foo(){ 
    if [[ $1 == 'something' ]]; then 
    shift 
    bar "[email protected]" 
    fi 
} 

foo "[email protected]" 
+0

Спасибо! Действительно ли кавычки нужны в 'foo '$ @" 'и' bar' $ @ "'? –

+2

@MishaMoroshko это не обязательно, но вы всегда должны указывать свои переменные, если у вас явно нет причин. Большую часть времени вы * не хотите разбивать слово. Я не цитировал '$ 1', потому что у вас нет проблем с разбиением на слова внутри' [[]] '. Я не верю, что то же самое относится к '[]' хотя – SiegeX

+0

Как всегда хорошая информация @SiegeX .. :) +1 –

3

Если вы не нуждаетесь в args массиве всего остального в foo, вы можете избежать его полностью, как в ответе SiegeX в. Если вам нужна args по какой-то другой причине, то, что вы делаете, является самым простым способом.

В вашем коде есть ошибка. Когда вы вызываете bar, вы передаете только первый элемент args. Чтобы передать все элементы, вам необходимо сделать это:

bar "${args[@]}"