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