【问题标题】:Ksh nested substitutionKsh 嵌套替换
【发布时间】:2015-02-14 13:46:39
【问题描述】:

我有以下配置文件:

export PROFILE_ACTIVE=0 

export PROFILE_SCSADP01[0]="0 84"
export PROFILE_SCSADP04[0]="85 170"
export PROFILE_SCSADP05[0]="171 255"

export PROFILE_SCSADP01[1]="-1 -1"
export PROFILE_SCSADP04[1]="85 170|0 42"
export PROFILE_SCSADP05[1]="171 255|43 84"

我想在 ksh 脚本中使用替换来访问这些变量:

我可以使用这种有效的语法轻松访问每个变量:

结果=${PROFILE_SCSADP01[${PROFILE_ACTIVE}]}

但是我需要粗体部分是可变的,而不是固定的。

我已经厌倦了这种语法:

Temp="PROFILE_SCSADP01"
result=${$Temp[${PROFILE_ACTIVE}]}

但是我总是得到一个糟糕的替换错误。 我试图寻找解决方法,但找不到任何可行的方法,

【问题讨论】:

  • 或者,您可以将 [ 和 ] 内的数字设为唯一变量。例如,PROFILE_SCSADP01[0] 可以变为 PROFILE_SCSADP[10]PROFILE_SCSADP01[1] 可以变为 PROFILE_SCSADP[11]。这样,您就无需在 [ 和 ] 内以及作为变量名本身的一部分使用变量。您可以使用 101,或 1001,或任何需要的。
  • 或者创建一个函数,该函数将使用诸如SET1_PROFILE_SCSADP01="0 84"(SET1/SET2 激活)之类的行进行 grep 和剪切配置文件。

标签: shell unix ksh aix substitution


【解决方案1】:

ksh 对此有 typeset -n 命令 (see here),我认为这是首选解决方案:

typeset -n tmp="PROFILE_SCSADP01"
result=${tmp[${PROFILE_ACTIVE}]}

您也可以为此使用eval (be careful):

tmp="PROFILE_SCSADP01"
result=$(eval echo \${$tmp[${PROFILE_ACTIVE}]})

eval 在命令运行之前对其进行一次解析,因此在eval 完成后,生成的命令如下所示:

result=$(echo ${PROFILE_SCSADP01[0]})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 2019-01-24
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2016-07-14
    • 2015-06-11
    • 2021-07-16
    相关资源
    最近更新 更多