変数の複雑な初期化[閉じる]

変数の複雑な初期化[閉じる]

次のスクリプトがあります。

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]}

関連情報