On 28.10.2010 16:20, Victor Wagner wrote:
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# set arg "arg-part1 arg-part2"
bash# printarg "$@"
"printarg"
"arg"
"arg-part1 arg-part2"
bash# var='arg "arg-part1 arg-part2"'
bash# set $var
bash# printarg "$@" ## плохо
"printarg"
"arg"
""arg-part1"
"arg-part2""
В-третьих, почитать доку на специфические возможности используемого
шелла. Может быть в bash или zsh есть специальные удобные средства для
этой цели.
Кто знает отпишите пожалуста!
В-четвертых, можно аккуратно квотить дважды. В смысле
OPTS="--foo \"\$FOO\"" или OPTS="--foo \"$FOO\"" (почувстуйте разницу
между этими двумя вариантами.
Не до конца работает:
$ var="--opt arg 'arg-part1 arg2-part2'"
$ printarg $var
"printarg"
"--opt"
"arg"
"'arg-part1"
"arg2-part2'"
Что бы заставить работать надо:
$ sh -c "printarg $var"
"printarg"
"--opt"
"arg"
"arg-part1 arg2-part2"
--
С уважением, Александр Гавенко.
--
To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/4cc980bc.6060...@bifit.com.ua