【问题标题】:Shell parameter substitution with sh用 sh 替换 shell 参数
【发布时间】:2020-03-25 09:00:25
【问题描述】:

在 bash 中,以下命令在使用参数替换的地方起作用

$ VALUE_AUS=20m; COUNTRY=AUS; PARAM=VALUE_$COUNTRY; echo ${!PARAM}
20m

但是在 Alpine 容器中使用 sh 相同的命令失败

# VALUE_AUS=20m; COUNTRY=AUS; PARAM=VALUE_$COUNTRY; echo ${!PARAM}
/bin/sh: syntax error: bad substitution

使用 /bin/sh 达到相同结果的正确语法是什么?

【问题讨论】:

  • ${!PARAM} 是一个 bash 扩展,Alpine 使用的是sh
  • 是的,所以我正在寻找一种在 sh 中获得相同行为的方法?
  • 等效要求使用eval
  • 使用eval "echo $PARAM"输出值VALUE_AUS,但需要的是20m,这是VALUE_AUS参数的值

标签: bash shell sh alpine


【解决方案1】:

间接变量是bash 扩展。

如果 Alpine 无法运行 bash,您将需要使用 eval 来模拟它。

# VALUE_AUS=20m; COUNTRY=AUS; PARAM=VALUE_$COUNTRY; eval "echo \"\$${PARAM}\""

【讨论】:

  • 这是我使用 alpine docker sh 得到的输出。你让它工作吗? # VALUE_AUS=20m; COUNTRY=AUS; PARAM=VALUE_$COUNTRY; eval "echo \"${!PARAM}\"" /bin/sh: syntax error: bad substitution
  • docker run -it alpine / # VALUE_AUS=20m; COUNTRY=AUS; PARAM=VALUE_$COUNTRY; eval "echo \"${!PARAM}\"" /bin/sh: syntax error: bad substitution
  • 我忘记删除!
  • 我仍然没有得到想要的输出。值需要 20m 但我得到的输出是 VALUE_AUS docker run -it alpine / # VALUE_AUS=20m; COUNTRY=AUS; PARAM=VALUE_$COUNTRY; eval "echo \"${PARAM}\"" VALUE_AUS
  • 我需要一个转义的$
猜你喜欢
  • 2017-11-25
  • 2018-01-06
  • 2018-10-19
  • 2011-06-11
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
相关资源
最近更新 更多