Я делаю основной сценарий переписать. Частично это устраняет eval по обычным причинам, которых можно избежать. Я сталкиваюсь с проблемой поиска подходящего способа управления сценарием следующего типа.
Рассмотрим эти два eval утверждения:
eval echo '${'#${role}'[@]}' users
loc_NagiosUsersAll+=($( eval echo '${'${role}'[@]}' " " ))
Первый выводит на экран количество пользователей в рамках данной роли. Второй добавляет всех этих пользователей в больший массив.
Роль - быть тем, кем оценивается текущая роль. Давайте назовем это read_only. Мы могли бы написать это первое утверждение следующим образом:
printf "${#read_only[@]} users"
Я испробовал десятки комбинаций скобок, кавычек и различной акробатики, чтобы бросить вызов и заставить их работать.
Вот версия эха-эха (использующая одну из реальных ролей) для сравнения:
$ echo echo '${'#${role}'[@]}' users
echo ${#authorized_for_all_host_commands[@]} users
$ echo ${#authorized_for_all_host_commands[@]} users
6 users
$ eval echo '${'#${role}'[@]}' users
6 users
Мне удалось отбросить все остальные операторы eval, но этот тип вырыт как галочка.
Итак, как я могу сделать это более безопасно, чем с помощью eval?
Еще код ...
declare -a NagiosUserRolesAll=( authorized_for_read_only
authorized_for_all_services
authorized_for_all_hosts
authorized_for_system_information
authorized_for_configuration_information
authorized_for_system_commands
authorized_for_all_service_commands
authorized_for_all_host_commands )
function func_NagiosUserDataGet(){ # was load_data_tables
local -a loc_NagiosUsersAll=""
printf "Loading users into the different tables. \n"
for role in "${NagiosUserRolesAll[@]}"
do
declare -ag $role="($( cat ${svnFilePath} | sed -n "s/${role}=//p" | sed 's/,/ /g' ))"
declare -n ref="${role}" # copy the reference, not the contents of the array
printf "The role ${role} has ${#ref[@]} users. \n"
loc_NagiosUsersAll+=(${ref[@]})
loc_NagiosUsersAll+=" "
done
printf "Creating list of unique users. \n"
NagiosUsersAllClean=($( echo ${loc_NagiosUsersAll[@]} | tr ' ' '\n' |
sort -u ))
printf "Total users: ${#NagiosUsersAllClean[@]}. \n"
}
function func_NagiosUsersShow(){ # was show_all_users
if [[ "${svnFileExists}" == '1' ]] ; then
printf "You'll need to checkout a cgi.cfg file first. \n"
return 1
fi
printf "\nThese are the roles with their users. \n\n"
for role in "${NagiosUserRolesAll[@]}"
do
# declare -ng ref="${role}" # copy the reference, not the contents of the array
printf "These users are in ${const_TextRed}${role}"
printf "${const_TextPlain}: "
printf "${const_TextGreen}"
# printf "${ref[@]} \n" # FAILS
printf "${ref[*]} \n" # ALSO FAILS (prints one user for each role)
# eval echo '${'${role}'[@]}' # WORKS
printf "${const_TextPlain} \n"
done
printf "\nNow for a list of unique users. \n\n"
func_EnterToContinue
printf "Unique users list: \n"
for i in "${!NagiosUsersAllClean[@]}"
do
printf "$i: ${NagiosUsersAllClean[$i]} \n"
done
func_EnterToContinue
}