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 [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected] Archive: http://lists.debian.org/[email protected]

