Предположим, что вы хотите получить список ключей, соответствующих определенному значению, и хотите сохранить этот список в массиве:
#!/bin/bash
declare -A hash
hash=(
[k1]="hello world"
[k2]="hello there"
[k3]="hello world"
[k4]=bumblebees
)
string="hello world"
keys=()
for key in "${!hash[@]}"; do
if [[ ${hash[$key]} == "$string" ]]; then
keys+=( "$key" )
fi
done
printf 'Keys with value "%s":\n' "$string"
printf '\t%s\n' "${keys[@]}"
Это просматривает список ключей и проверяет значение, соответствующее каждому ключу, на соответствие строке, которую мы ищем. Если есть совпадение, мы сохраняем ключ в массиве keys
.
В конце выводятся найденные ключи.
Вывод этого скрипта будет
Keys with value "hello world":
k1
k3
Нет, это не состояние гонки, а ошибка на стороне клиента из-за несогласованности данных.
В репозитории есть файл со списком элементов/пакетов, содержащихся в нем. Этот файл создается/обновляется в конце создания/обновления репозитория.
Если клиент открывает репозиторий и читает файл содержимого во время записи, его yum
вылетит с ошибкой.
Если файл не записывается, но вы меняете содержимое репозитория, данные могут быть несогласованными. Клиент yum
выйдет из строя, потому что ссылка на файл в файле содержимого недоступна для чтения.
Если вы хотите минимизировать проблемы, вы можете работать с копией репозитория (в зависимости от его размера );
# rm -fr newrepo oldrepo
# rsync -ua repo/ newrepo/
# cd newrepo
(then update this copy or the repository)
# cd..
# mv repo oldrepo; mv newrepo repo
# rm -fr oldrepo
Это сократит время переключения, хотя и не позволит полностью избежать ошибок клиента.