有條件地將參數傳遞給腳本

有條件地將參數傳遞給腳本

我有一個在 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=falsecond=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}

相關內容