2014-12-12 3 views
1

В настоящее время я пытаюсь написать сценарий Bash, который может отправлять несколько заданий в кластер SGE QSUB и представлять некоторые переменные среды для каждой работы.создать список, разделенный запятой, содержащий имена всех переменных, начинающихся с префикса

Чтобы передавать переменные в каждое задание, мне нужно указать все переменные, которые я хочу передать как одну строку (в виде списка, разделенного запятыми, например 'var1={var1},var2={var2}').

Мне интересно, как автоматизировать этот процесс. В частности, я хотел бы написать скрипт, который делает следующее:

1) собирать имена всех переменных, которые начинаются с определенного префикса 2) отогнать префикс из этих имен 3) создать список разделенных запятыми

в качестве примера рассмотрим следующий сценарий (где префикс jobvar):

jobvar_my_vector=(0.1 2.00 3.00) 
jobvar_my_string="hello" 
other_variable="yesyesyes" 

Здесь команда будет в основном производить переменную list_of_variables которая будет строка, как: "my_string=${my_string},my_vector=${my_vector}"

ответ

2

Вы можете использовать команду set в режиме POSIX, чтобы перечислить всю переменную. Затем используйте канал для awk для анализа переменной и получения желаемого результата.

s=$(set -o posix; set | awk -F '(jobvar_|=)' '/^jobvar_/{printf "%s=${%s},", $2, $2}') 
echo "$s" 
my_string=${my_string},my_vector=${my_vector}, 

В BASH вы также можете использовать compgen -v, чтобы получить все переменные:

s=$(compgen -v | awk -F '(jobvar_|=)' '/^jobvar_/{printf "%s=${%s},", $2, $2}') 
echo "$s" 
my_string=${my_string},my_vector=${my_vector}, 
+1

Почему бы просто не использовать подстановку параметров, который возвращает все переменные с заданным префиксом вместо этого? –

+1

Спасибо! Оба рабочих решения великолепны. Я добавил дополнительную строку 's = '$ {s%?}" ', Чтобы удалить последний', 'в конце строки. –

+0

Добро пожаловать, рад, что это сработало. – anubhava