0

我有一个 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

4 回答 4

1

eval是为了:

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

应该显示 的值$SESSION_ONE_USER

于 2013-06-11T16:00:36.207 回答
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
于 2013-06-11T16:28:36.077 回答
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

这 ”!” 做一定程度的间接。请参阅外壳参数扩展

于 2013-06-11T17:02:24.747 回答
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 不能包含... 不能与任何其他选项一起使用。

于 2013-06-12T21:18:48.750 回答