하나의 변수에 여러 데이터 항목을 할당할 수 있나요? 그렇다면 어떻게 배포되나요?

하나의 변수에 여러 데이터 항목을 할당할 수 있나요? 그렇다면 어떻게 배포되나요?

저는 Linux Bash/Shell을 사용하고 있으며 여러 개별 데이터 항목을 변수에 할당하는 방법을 알고 싶습니다.

예를 들어 팀 목록입니다. 각 팀이 요구하는 데이터는 홈 경기 총 득점 - 원정 경기 총 득점 - 홈 경기 총 득점 - 원정 경기 총 득점 등입니다.

답변1

쉘은 bash단일 일반 변수에 개별 문자열을 저장하고, 배열에 문자열 목록을 저장하고, 연관 배열에 다른 문자열과 연관된 문자열을 저장할 수 있습니다. 예를 들어 배열의 배열 또는 연관 배열의 연관 배열(또는 이들의 조합)을 저장할 수 없습니다.

귀하가 언급한 특정 데이터에 대해서는할 수 있다연관 배열과 같은 작업을 수행하십시오.

declare -A goals

goals["teamA"]="0:2:3:4"
goals["teamB"]="1:3:3:3"
# etc.

또는

declare -A goals

goals=(
    ["teamA"]="0:2:3:4"
    ["teamB"]="1:3:3:3"
    # etc.
)

그런 다음 :필요할 때 분리된 값을 구문 분석합니다.

for team in "${!goals[@]}"; do
    home_goals=$( cut -d : -f1 <<<"${goals[$team]}" )
    away_goals=$( cut -d : -f2 <<<"${goals[$team]}" )
    # etc.

    # use "$team", "$home_goals", "$away_goals" etc. here
done

...하지만 그럴거야많은이는 Perl이나 Python과 같은 언어를 사용하여 보다 효율적으로 수행할 수 있습니다.하다임의로 중첩된 데이터 구조가 허용됩니다.

예를 들어 Perl에서는 다음과 같습니다.

my %goals = ( "teamA" => [ 0, 2, 3, 4 ],
              "teamB" => [ 1, 3, 3, 3 ],
              # etc.
            );

답변2

내가 아는 쉘은 중첩된 데이터 구조가 없기 때문에 이와 같은 구조화된 데이터를 잘 처리하지 못합니다. (여기에는 태그한 Bash가 포함됩니다.) 객체 목록이나 C 스타일 구조가 필요하지만 가지고 있는 것은 배열과 연관 배열뿐입니다.

한 가지 방법은 보유한 각 데이터(득점, 실점...)에 대해 별도의 연관 배열을 만들고 팀 이름별로 배열을 입력하는 것입니다.

예를 들어

declare -A goals_scored goals_conceded
goals_scored[Liverpool]=4
goals_conceded[Liverpool]=2
goals_scored[Tottenham]=3
goals_conceded[Tottenham]=3
for team in "${!goals_scored[@]}"; do       # iterate over the keys of goals_scored
    echo "$team has scored ${goals_scored[$team]} goals"
done

데이터 항목이 최상위 수준에 있고, 예를 들어 플레이어에 대한 구조도 있는 경우 혼동되기 시작하기 때문에 이는 약간 보기 흉합니다. (예를 들어 goals_scored팀이나 선수에게도 적용될 수 있으니 어떻게든 구분해야 합니다.)

아마도 적절한 프로그래밍 언어를 사용하는 것이 더 나은 생각일 것입니다.

바라보다배열/연관배열존재하다배쉬 가이드연관 배열에 대한 추가 정보.

답변3

ksh93복합 변수를 사용하여 이 작업을 수행 할 수 있습니다 .

ksh93$ typeset -A teams
ksh93$ teams[A]=(scored=(home=3 away=7) conceded=(home=1 away=0))
ksh93$ teams[B]=(scored=(home=2 away=0) conceded=(home=3 away=1))

ksh93$ echo ${teams[A].conceded}
( away=0 home=1 )
ksh93$ echo ${teams[A].conceded.away}
0
ksh93$ teams[A].conceded.away=1

불행히도 해시처럼 처음부터 자동으로 활성화되지는 않습니다 perl.

ksh93$ foo.bar.baz=quux
ksh93: foo.bar.baz=quux: no parent

ksh93$ foo=()  # or typeset -C foo
ksh93$ foo.bar.baz=quux

ksh93$ typeset -p foo
typeset -C foo=(bar=(baz=quux))

관련 정보