
일부 매개변수를 허용하는 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}