我有一个脚本如下:
if [[ is_case1 -eq "1" ]]; then
VAR_A=$1
VAR_B=$2
VAR_C=$3
VAR_D=$4
elif [[ is_case1 -eq "2" ]]; then
# initialize the variables here with specific logic
VAR_A=…
VAR_B=…
VAR_C=…
VAR_D=…
else
# initialize the variables here with specific logic
VAR_A=…
VAR_B=…
VAR_C=…
VAR_D=…
fi
我真的不喜欢这个,因为如果我有另一种情况,初始化就会变得越来越长。
这样的案例如何写得更优雅呢?
答案1
如果您使用值数组而不是单个变量,初始化可能会更漂亮:
#!/bin/bash
# set default values:
values=( "val1" "val2" "val3" ) # or values=()
case "$somevalue" in
1) values=( "$@" ) ;; # get values from command line
2) values=( "some" "other" "values" ) ;; # use other values
*) # other cases uses default values
esac
答案2
不确定您要确切解决什么问题,但如果您希望将几种情况的值编码在数组的关联数组中(为此您需要 ksh93,其他 shell 不支持数组的数组),请在ksh93
你可以这样做:
#! /bin/ksh93 -
cases=(
[1]=("$@")
[2]=(foo 'x y' bar baz)
[whatever]=(w x y z)
[none]=()
)
values=(some default values)
[[ -v cases[$is_case1] ]] && values=("${cases[$is_case1][@]}")
# assign to separate variables if need be.
VAR_A=${values[0]}
VAR_B=${values[1]}
VAR_C=${values[2]}
VAR_D=${values[3]}