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

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



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"

--
С уважением, Александр Гавенко.


Reply to: