조건부로 인수를 스크립트에 전달

조건부로 인수를 스크립트에 전달

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

여기서 의 값은 condnull이 아닌 경우(값이 null인지 여부 cond=false에 관계 없이 ) 확장됩니다 . 이는 배열만큼 보기 흉하지는 않지만 따옴표 배치에 주의하세요.cond=0cond=truep2

또한보십시오:

답변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}

관련 정보