Загрузить условие в строке исполнения в Bash

221
Juan

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

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

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

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

1
У меня есть более простое решение, чем то, которое вы приняли, пожалуйста, посмотрите на него. Приветствия. MariusMatutiae 7 лет назад 0

4 ответа на вопрос

1
John1024

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

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

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

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

  • opts=()

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

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

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

  • command ... "$"

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

Спасибо! Оно работало завораживающе. Просто для любопытства, что означает «@»? Juan 7 лет назад 0
@Juan Glad it worked for you. The `@` in `$` tells bash to expand each element of `opts` to a separate word. John1024 7 лет назад 0
0
JakeGould

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

function command_function () { command ... -option $variable }  if [ -n "$variable" ] then command_function ... -option $variable else command_function ... fi 

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

0
levif

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

$ echo $  $ variable=yes $ echo $ -option yes 
0
MariusMatutiae

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

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

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

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

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

Похожие вопросы