配列があり、唯一の2番目のメンバーを取得したいと思います。
bashには実際には2次元配列がないので、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'
)
以下を使用して、配列の2番目の要素を正常に繰り返すことができます。
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"