저는 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))