Назначьте системные переменные, предоставленные именами переменных в массиве - PullRequest
0 голосов
/ 30 сентября 2019

Существует множество переменных для присвоения значения. Я смог сделать это глупо, скопировав один и тот же фрагмент кода, а затем изменив другой фрагмент. Например, я хочу сделать следующее: export country = "US" export city = "LA"

Глупый способ с пользовательским интерфейсом ввода:

printf "\nPlease assign country$ \n" ;  
if [[ $country == nil ]] ; then
    printf "Current value is nil\n"
else
    printf "Current value is: $country\n"
fi ;
printf "country: " ;
read -e -i $country country_
export country=$country_

А для города я просто ищу - заменяю "страна" на "город" и пропускаю код, что глупо, но работает. Теперь я хочу улучшить читаемость, а также удобство сопровождения кода, купить размещение переменных в списке и затем выполнить итерацию по этому списку. Наполовину отработанный код, после поиска в Google:

declare -a var_list=("country" "city")
for var in ${var_list[*]}
    do
        printf "\nPlease assign $var \n" ;  
        if [[ ${!var} == nil ]] ; then
            printf "Current value is nil\n"
        else
            printf "Current value is: ${!var}\n"
        fi ;
        printf "${bold}$var: ${normal}" ;
        read -e -i ${!var} {$var_}
        export $var={$var_}
    done

Следующие 2 строки кода по-прежнему некорректны для выполнения того, что я хочу, чтобы они делали:

read -e -i ${!var} {$var_}
export $var={$var_}

Iхотел бы получить помощь по этому вопросу.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Создайте функцию из нее и передайте ей имя переменной:

get() {
        # descriptive variable names
        local var previousvalue
        var="$1"
        previousvalue="${!1}"

        # superfluous, servers as a documentation
        # The string "$1" should be a global variable
        declare -g "$var"

        # Asking the real questions:
        printf "\nPlease assign $var \n"
        printf "Current value is '$previousvalue'\n"
        read -e -p "$1: " -i "$previousvalue" "$var"
}


declare -a var_list=("country" "city")
for i in "${var_list[@]}"; do           # or just `for i in country city; do`
        get "$i"
done

echo
echo "country=$country"
echo "city=$city"

пример выполнения:

Please assign country 
Current value is ''
country: Poland

Please assign city 
Current value is ''
city: Warsaw

country=Poland
city=Warsaw

Примечания:

  • Неиспользуйте for var in ${var_list[*]}, он будет неправильно обрабатывать элементы массива с пробелами внутри них. Do for var in "${var_list[@]}". "${...[@]}" будет правильно заключать в кавычки и передавать все переменные.
  • Строка export $var={$var_} экспортирует переменную с именем расширения $var в строку, состоящую из { расширения переменной var_ и }. Я думаю, вы не хотите включать { } в значение. Я думаю, вы хотели написать "${var}_" или "${var_}" - { должно быть после $.
0 голосов
/ 30 сентября 2019

Я предлагаю вам не прибегать к косвенной косвенности и вместо этого использовать функцию:

display_and_read() {
  local item_type="$1" previous_value="$2"
  printf "\nPlease assign $item_type$ \n" ;  
  if [[ $previous_value == nil ]] ; then
    printf "Current value is nil\n"
  else
    printf "Current value is: $previous_value\n"
  fi ;
  printf "$item_type: " ;
}

display_and_read "country" "$country"
read -e -i $country country_
export country=$country_

display_and_read "city" "$city"
read -e -i $city city_
export city=$city_
...