배열이 있고 유일한 두 번째 멤버를 가져오고 싶습니다.
bash에는 실제로 2차원 배열이 없으므로 ::
두 요소 사이의 구분 기호로 사용되도록 다음과 같이 정의했습니다.
ruby_versions=(
'company-contacts::1.7.4'
'activerecord-boolean-converter::1.7.4'
'zipcar-rails-core::1.7.4'
'async-tasks::1.7.13'
'zc-pooling-client::2.1.1'
'reservations-api::1.7.4'
'zipcar-auth-gem::1.7.4'
'members-api::1.7.4'
'authentication-service::1.7.4'
'pooling-api::2.1.1'
)
다음을 사용하여 배열의 두 번째 요소를 성공적으로 반복할 수 있습니다.
rvm list > $TOP_DIR/local_ruby_versions.txt
for repo in "${ruby_versions[@]}"
do
if grep -q "${repo##*::}" $TOP_DIR/local_ruby_versions.txt
then
echo "ruby version ${repo##*::} confirmed as present on this machine"
else
rvm list
echo "*** EXITING SMOKE TEST *** - not all required ruby versions are present in RVM"
echo "Please install RVM ruby version: ${repo##*::} and then re-run this program"
exit 0
fi
done
echo "A
유일한 단점은 루비 버전이 동일한 경우(일반적으로 그렇습니다) 작업을 반복하므로 다음을 얻습니다.
ruby version 1.7.4 confirmed as present on this machine
ruby version 1.7.4 confirmed as present on this machine
ruby version 1.7.4 confirmed as present on this machine
ruby version 1.7.13 confirmed as present on this machine
ruby version 2.1.1 confirmed as present on this machine
ruby version 1.7.4 confirmed as present on this machine
ruby version 1.7.4 confirmed as present on this machine
ruby version 1.7.4 confirmed as present on this machine
ruby version 1.7.4 confirmed as present on this machine
ruby version 2.1.1 confirmed as present on this machine
내가 가지게되면
ruby_versions=(
'company-contacts::1.7.4'
'activerecord-boolean-converter::1.7.4'
'zipcar-rails-core::1.7.4'
'async-tasks::1.7.13'
'zc-pooling-client::2.1.1'
'reservations-api::1.7.4'
'zipcar-auth-gem::1.7.4'
'members-api::1.7.4'
'authentication-service::1.7.4'
'pooling-api::2.1.1'
)
1.7.4와 2.1.1을 한 번만 확인하도록 하려면 어떻게 해야 합니까?
즉, 배열 선택을 (1.7.4 2.1.1)로 어떻게 바꾸나요?
이 컨텍스트에서는 실제 저장소 이름을 무시할 수 있습니다.
답변1
연관 배열을 사용할 수 있습니다.
declare -A versions
for value in "${ruby_versions[@]}"; do
versions["${value##*::}"]=1
done
printf "%s\n" "${!versions[@]}"
1.7.4
1.7.13
2.1.1
또는 파이프를 사용하십시오.
mapfile -t versions < <(printf "%s\n" "${ruby_versions[@]}" | sed 's/.*:://' | sort -u)
printf "%s\n" "${versions[@]}"
1.7.13
1.7.4
2.1.1
답변2
echo "${ruby_versions[@]}" | sed 's/\S\+:://g;s/\s\+/\n/g'| sort -u
산출:
1.7.13
1.7.4
2.1.1
아니면 당신이 선호한다면bash builtins
unset u
for i in "${ruby_versions[@]}"
do
if [[ ! $u =~ ${i##*::} ]]
then
u=${u:+$u\\n}${i##*::}
fi
done
echo -e "$u"