我有一个数组,我想获得唯一的第二个成员
bash 并没有真正的二维数组,所以我这样定义它,用作::
两个元素的分隔符:
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 版本相同时(通常是这种情况),它会重复该操作,所以我得到
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"