1

Я хочу выполнить команду с параметром, который зависит от присвоения переменной. Если переменная установлена, загрузите опцию со значением, но если нет, не загружайте эту опцию. Вот что у меня есть:

if [ -n "$variable" ]
  then command ... -option $variable
  else command ...
fi

Идея состояла бы в том, чтобы объединить это в одну команду с условием, чтобы мне не пришлось повторять другие параметры команды два раза.

Большое спасибо за уделенное время.

4 ответа4

1

Использование массивов bash:

opts=()
[ "$variable" ] && opts+=(-option "$variable")
command ... "${opts[@]}"

Поскольку при этом используются массивы bash, это будет работать, даже если $variable содержит пробелы или другие сложные символы.

Как это устроено

  • opts=()

    Это создает пустой массив с именем opts .

  • [ "$variable" ] && opts+=(-option "$variable")

    Если $variable не пуста, то мы добавляем -option и $variable к массиву opts .

  • command ... "${opts[@]}"

    Это выполняет вашу команду. Если opts не пуст, то его элементы добавляются в команду. Если opts пуст, ничего не добавляется: это было бы так, как будто "${opts[@]}" вообще не было.

0

Следующая строка будет делать:

[ x"$VARIABLE" = x ] && echo UNSET || echo SET

Это проверяет, равна ли переменная x "$ VARIABLE" x, другими словами, если $ VARIABLE пусто; если тест удовлетворен, выполняется первая опция (echo UNSET), если тест не удовлетворяется, выполняется последняя опция (echo SET). Если вы не хотите ничего делать во втором случае, вы можете сделать

[ x"$VARIABLE" = x ] && echo UNSET || :

Это значительно проще, чем другие решения, позволяет оценить условие только один раз, устойчиво к странным символам, появляющимся в VARIABLE.

0

Затем возьмите свою команду и сделайте так:

function command_function () {
  command ... -option $variable
}

if [ -n "$variable" ]
  then command_function ... -option $variable
  else command_function ...
fi

Просто чтобы вы знали, что скобки в функции Bash ничего не пропускают.

0

Использование подстановки Bash (Shell-Parameter-Expansion) для краткого, все еще читаемого синтаксиса:

$ echo ${variable:+-option $variable}

$ variable=yes
$ echo ${variable:+-option $variable}
-option yes

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .