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: