Я хочу выполнить команду с опцией, которая зависит от атрибута переменной. Если переменная установлена, загрузить опцию со значением, но если нет, не загружать эту опцию. Вот что у меня есть:
if [ -n "$variable" ]
then command ... -option $variable
else command ...
fi
Идея состоит в том, чтобы объединить это в одну команду с условием внутри, чтобы мне не приходилось повторять другие параметры команды дважды.
Большое спасибо за ваше время.
решение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[@]}"
его вообще не было.
решение2
Затем возьмите вашу команду и сделайте ее функцией, например:
function command_function () {
command ... -option $variable
}
if [ -n "$variable" ]
then command_function ... -option $variable
else command_function ...
fi
Просто чтобы вы знали, скобки в функции Bash ничего не передают.
решение3
С использованиемБашзамена (Расширение параметров оболочки) для краткого, но читабельного синтаксиса:
$ echo ${variable:+-option $variable}
$ variable=yes
$ echo ${variable:+-option $variable}
-option yes
решение4
Подойдет следующий однострочный текст:
[ x"$VARIABLE" = x ] && echo UNSET || echo SET
Это проверяет, является ли переменнаяx"$ПЕРЕМЕННАЯ"равноИкс, другими словами, если$ПЕРЕМЕННАЯпусто; если тест пройден, то первый вариант (эхо ОТКЛЮЧЕНО) выполняется, если тестнетудовлетворен последний вариант выполнен (эхо SET). Если вы не хотите ничего делать во втором случае, вы можете сделать
[ x"$VARIABLE" = x ] && echo UNSET || :
Это значительно проще других решений, позволяет оценить условие только один раз, устойчиво к появлению странных символов в ПЕРЕМЕННОЙ.