2016-02-19 4 views
1

У меня есть функция, которая получает имя приложения и версииBash набора переменной функция

function get_versions() { 
ver_file="versions.txt"; 
for service in $(cat $ver_file | cut -f1 -d:) ; do 
for ver in $(grep $service $ver_file | cut -f2 -d:) ; do 
    local $service_ ver=$ver; 
done; 
done; 
} 

Я хочу, чтобы установить переменные окружения, такие как апач-вера = 2,0, например. (от эхо будет эхо $ апача-Вер) в versions.txt выглядеть: апач: 2,0

Я пробовал много способов, чтобы установить его , но я не нашел решение для этого спасибо

ответ

2

Вот моя версия. Я отказываюсь от cat и cut, используя вместо этого IFS и read. Обратите внимание, что любая переменная, инкапсулированная внутри функции, помечена как local.

Вы не можете иметь имя переменной, содержащее дефис в bash, поэтому apache-ver=2.0 недействителен. Вместо этого я использовал подчеркивание.

Переменные динамически создаются с использованием eval, и это один из немногих случаев, когда это полезно, но почему вы хотите динамически создавать имя переменной, является загадкой. Вы можете легко добавить export к этой строке, если это необходимо, однако, поскольку динамическая переменная не помечена как локальная, она видна во всем скрипте.

# Use fuction, or(), not both 
get_versions() { 
    local ver_file="versions.txt" 
    local service ver 

    while IFS=':' read service ver 
    do 
     local name="${service}_ver" 

     # Sanitize edit 
     name=${name/[\-.]/'_'} 
     eval "$name='$ver'" 
    done < "$ver_file" 
} 

get_versions 
echo $apache_ver 
echo $tester_ver 

Мои versions.txt выглядит следующим образом:

apache:2.0 
tester:3.3 

Скрипт выводит:

2.0 
3.3 
+0

Hi.thanks, что значит "Использование функции, или(), а не как"? примеры PLS? –

+0

У меня проблема, такие как «apr-util: 1.5.4», «php5.4: 5.4.45», дайте мне ошибку «1.sh: строка 6: apr-util_ver = 1.5.4: команда не найдена "," 1.sh: строка 6: php5.4_ver = 5.4.45: команда не найдена " –

+0

Используйте' export' вместо 'eval'. Помимо проблем безопасности, 'eval' требует, чтобы' $ ver' был правильно указан. Сравните 'eval 'foo = 1 2" 'с' export' foo = 1 2 "'. – chepner

0

Вы можете использовать экспорт в архив этого

/ # cat versions.txt 
aaaa:01 
bbbb:02 

/# cat test.sh 
#/bin/bash 

ver_file=versions.txt 
for service in $(cat $ver_file | cut -f1 -d:) ; do 
for ver in $(grep $service $ver_file | cut -f2 -d:) ; do 
    echo export $service=$ver 
done; 
done; 

/# eval $(./test.sh) 
/# echo $aaaa 
01 
/# echo $bbbb 
02 
/# 
Смежные вопросы