次のスクリプトがあります。
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が必要ですが、他のシェルは配列配列をサポートしていません)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]}