[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Подстановка переменного числа аргументов



On 2010.10.28 at 15:14:51 +0300, Serhiy Storchaka wrote:

> Здравствуйте.
> 
> Прошу прощения за такой элементарный и не совсем тематический вопрос, но это 
> наиболее компетентная группа, которую я сейчас читаю.
> 
> Задача. В зависимости от некоторых условий необходимо вызвать команду с 
> дополнительными аргументами или без них. Например:
> 
>    if somecheck
>    then
>       OPTS="--foo $FOO"
>    else
>       OPTS=""
>    fi
>    bar -ziq $OPTS bla-bla-bla
> 
> Проблема в том, что $FOO может быть пустым (тогда подставится лишь один 
> аргумент --foo) или содержать пробелы (тогда подставится больше двух 
> аргументов).
 
> Можно, конечно, написать:
> 
>    if somecheck
>    then
>       bar -ziq --foo "$FOO" bla-bla-bla
>    else
>       bar -ziq bla-bla-bla
>    fi
> 
> И всё будет работать как надо. Но хотелось бы избежать дублирования, 
> постоянные аргументы вызова могут быть громоздкими. Не говоря уж о том, что 
> если будет несколько условий, код разрастётся в геометрической прогрессии.
> 
> Как быть?

Ну во-первых, можно подумать о подстановках вида ${FOO:+--foo "${FOO}"}

Это на тот случай если задача ставится так "Если перемная FOO не пуста,
подставляем ключик --foo "$FOO", иначе не делаем ничего.

Во-вторых, можно подумать об использовании команды set, которая позволит
засунуть нужные параметры на место аргументов шелловского скрипта. И
потом подставлять через "$@" - c cохранением разбиения на аргументы.

В-третьих, почитать доку на специфические возможности используемого
шелла. Может быть в bash или zsh есть специальные удобные средства для
этой цели. 

В-четвертых, можно аккуратно квотить дважды.  В смысле
 OPTS="--foo \"\$FOO\"" или OPTS="--foo \"$FOO\"" (почувстуйте разницу
 между этими двумя вариантами.


Reply to: