ksh:使用另一个参数的值定义参数名称

时间:2013-06-11 15:26:47

标签: 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的值。 有没有人有任何解决方案?

4 个答案:

答案 0 :(得分:1)

这是eval的用途:

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

应显示$SESSION_ONE_USER

的值

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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 - 声明或显示带属性的变量

<强>概要

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

-n 名称参考。

该值是name引用的变量的名称。 name不能包含..。不能与任何其他选项一起使用。