
У меня есть скрипт, работающий на 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}