Условная передача параметров в скрипт

Условная передача параметров в скрипт

У меня есть скрипт, работающий на Linux, который принимает некоторые параметры.
Я хотел бы сделать что-то вроде:

if [[ $CONDITION == "true" ]]; then  
  script param1 --param2  
else
  script param1  
fi 

Я хотел бы избежать разветвления пути if.
Есть ли более оптимальный способ передать второй параметр?

решение1

Наиболее расширяемым и надежным способом, вероятно, будет использование массива для хранения необязательных параметров:

params=()
if [[ $CONDITION == true ]]; then
    params+=(--param2)
fi
script param1 "${params[@]}"

Или сокращенно:

[[ $CONDITION == true ]] && params+=(--param2)
script param1 "${params[@]}"

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

Обратите внимание, что это важно сделать с массивом: если вы замените массив обычной переменной ( params="--param2"; script param1 $params), вам придется либо раскрывать переменную без кавычек, со всеми вытекающими отсюда проблемами, либо раскрывать ее в кавычках, и в этом случае вы передадите пустую строку в качестве аргумента, если переменная пуста.

В таком простом случае можно также использовать расширение «альтернативного значения»:

cond=x
p2="--param2"
script param1 ${cond:+"$p2"}

Здесь, если condнепусто (независимо от того, является ли он cond=falseили cond=0вместо cond=true), значение p2расширяется. Это может показаться менее уродливым, чем массивы, но будьте осторожны с размещением кавычек.

Смотрите также:

решение2

Универсальный способ сделать это — задать аргументы в массиве. Самый простой массив — это список позиционных параметров, определенных с помощью set. Вы можете построить список параметров последовательно.

set -- param1
if [[ $CONDITION == "true" ]]; then  
    set -- "$@" --param2  
fi 

command "$@"  

Что можно свести к следующему:

set -- param1
[[ $CONDITION == "true" ]] && set -- "$@" --param2
command "$@"  

Если необходимо сохранить список позиционных параметров, то можно:

  • Используйте функцию:

    callcommand(){     set -- param1
                       [[ $CONDITION == "true" ]] && set -- "$@" --param2
                       command "$@"       
                 }
    callcommand
    
  • Или используйте другую переменную массива:

    paramArray=()
    paramArray+=(param1)
    [[ $CONDITION == "true" ]] && paramArray+=( "--param2" )
    command "${paramArray[@]}"
    

решение3

PARAMS+=" param1"
if [[ $CONDITION == "true" ]]; then  
  PARAMS+=" --param2"
fi
script ${PARAMS}

Связанный контент