다음과 같은 스크립트가 있습니다.
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]}