2013-06-11 2 views
0

У меня есть сценарий ksh, который считывает скрипт профиля с определенным количеством сеансов. Каждая сессия определяет свои собственные параметры, как, например:ksh: Определение имени параметра с другим значением параметра

SESSION_ONE_USER=... 
SESSION_ONE_PWD=... 
SESSION_TWO_USER=... 
... 

Скрипт получает параметр SESSION из командной строки, но я просто установить его на примере.

Я хочу, чтобы значение параметра SESSION определить часть другого имени параметра, что мне нужно значение из, как:

SESSION="SESSION_ONE" 
USER=${${SESSION}_USER} 
PASS=${${SESSION}_PWD} 

Это дает мне ошибку компиляции. Я также попытался

GET_USER_PARAM(){ 
    echo ${SESSION}_USER 
} 
echo $`GET_USER_PARAM` 

Но что возвращает $ SESSION_ONE_USER

Я хочу, чтобы вернуть значение параметра SESSION_ONE_USER вместо. Есть ли у кого-нибудь решения?

ответ

1

Это то, что eval для:

SESSION=SESSION_ONE 
eval echo \$${SESSION}_USER 

должен отображать значение $SESSION_ONE_USER.

+0

При присвоении значения переменной мне казалось, что нужно поместить линию eval в функцию и вызвать функцию как SUSER ='SUFUNC', иначе она вернет только имя. Тем не менее, это было именно то, что мне нужно! Спасибо. –

+0

Вам не нужна функция. Кажется, это работает для меня: 'SUSER = blah; ТМП = USER; eval X = \ $ S $ {TMP}; echo $ {X} 'производит« бла ». Нет необходимости в кавычках, но нужно избегать первого '' ''. Котировки станут необходимыми, если переменная, о которой идет речь, содержит пробелы, но вы хотите получить двойные кавычки для этого и все равно избегать '$' ... – twalberg

1

не делают обезьяны с именами переменных, использовать ассоциативные массивы вместо

typeset -A users 
typeset -A pwd 

session=SESSION_ONE 
users[$session]=joe 
pwd[$session]=secret 

for key in "${!users[@]}"; do 
    echo "user for session $key is ${users[$key]}" 
    echo "pwd for session $key is ${pwd[$key]}" 
done 
+0

Это хорошая идея. Но мне нужно внести существенные изменения в оставшееся приложение, чтобы разместить его. –

1

Попробуйте это: "!"

SESSION="SESSION_ONE" 
SESSION_ONE_USER="foo" 
SESSION_ONE_PWD="bar" 

SESSION_USER=${SESSION}_USER 
SESSION_PWD=${SESSION}_PWD 

USER=${!SESSION_USER} 
PASS=${!SESSION_PWD} 

echo $USER 
echo $PASS 

делает уровень косвенности. См. Shell Parameter Expansion.

+0

Это тоже работает. Я принял другой ответ только потому, что было меньше строк кода. (Это был единственный объективный способ, о котором я мог думать) –

+0

Конечно. Просто имейте в виду, что этот подход (расширение параметров) является чуть более эффективным (и стандартным). Приятно знать, я думаю. Другой подход включает выполнение двух команд (эхо и eval). Это внутренние, так что это быстро. Но расширение параметра - это более быстрый путь через оболочку. – Ziffusion

+0

'bash' и' ksh' здесь отличаются. 'ksh' просто возвращает имя переменной. Для массивов он возвращает список индексов, для ассоциативных массивов - список ключей. –

1

Если это ksh, то это работа для nameref

alias nameref='typeset -n'

Пример решения

function session_parameters { set -u 
    typeset session=${1:?session name} 
    nameref user=SESSION_${session}_USER 
    nameref pass=SESSION_${session}_PASS 
    print session=$session user=$user pass=$pass 
} 
SESSION_ONE_USER="User1" 
SESSION_ONE_PASS="Pass1" 
SESSION_TWO_USER="User2" 
SESSION_TWO_PASS="Pass2" 
for s in ONE TWO THREE; do 
    session_parameters $s 
done 

Пример вывода

session=ONE user=User1 pass=Pass1 
session=TWO user=User2 pass=Pass2 
test_session_parameters[12]: session_parameters: line 5: 
SESSION_THREE_USER: parameter not set 

Обратите внимание на использование set -u, чтобы вызвать сообщение об ошибке в строке 3.


nameref использование: (от встроенного текста справки)

ИМЯ

набрана - объявлять или отображать переменные с атрибутами

СИНТАКСИС

typeset [ options ] [name[=value]...]

-n Наименование ссылки.

Значение - это имя переменной, которая содержит name ссылок. name не может содержать ... Невозможно использовать другие параметры.

Смежные вопросы