【问题标题】:Nested Variables in Bourne Shell (bin/sh)Bourne Shell 中的嵌套变量 (bin/sh)
【发布时间】:2019-07-16 22:29:56
【问题描述】:

我有一个具有嵌套值的变量。

x=hello
y=world
helloworld=monday

TEMP=$x$y 
echo "${!TEMP}"   # I get output "monday" which is required

这在 bash 中有效,但在普通 sh 中无效。当我使用 sh 运行相同的命令时,最后一行给出“Bad Substitution”。

如何使用 sh 获得相同的结果?由于某些原因,我无法将 shell 从 sh 更改为 bash,所以我必须使用 sh 来完成。

【问题讨论】:

  • 间接变量名引用是主要的代码异味。 What are you trying to do?肯定会有更好的方法。
  • 确实 POSIX shell 没有可变间接性,我赞同 @johnkugelman 关于代码异味的评论。
  • 我有两个变量,比如 x 和 y,当我组合它们的值时,它们形成另一个变量,就像我上面提到的那样,现在我想从 x 和 y 的值中获取该变量的值。 ...我不认为我解释得很好。 :(
  • 有没有更好的方法来达到同样的目标?因为在 bash 中我可以做到,然后在 sh 中一定有办法
  • 不不,不要使用 eval。如果您可以退后一步,告诉我们您在代码中的更大目标是什么,我们可以告诉您实现它的更好方法。阅读我在第一条评论中链接的XY problem 页面。您正在询问您尝试的解决方案,我们想知道您的实际问题是什么。 “你正在尝试解决问题 X,并且你认为解决方案 Y 会奏效,但是当你遇到麻烦时,你不会问 X,而是问 Y。”

标签: linux bash shell sh


【解决方案1】:

因为sh 不同于bash difference-between-sh-and-bash。 但是您可以使用这种方式获取helloworld 的内容,也许有更好的方法,但如果您只对解决方案感兴趣,那么这将为您提供所需的内容:)

#!/bin/sh
x=hello
y=world
helloworld=monday
TEMP=$x$y
TEMP_FINAL='eval "echo \$$TEMP"'
eval "$TEMP_FINAL"

【讨论】:

  • 是的,我已经这样做了,而且效果很好,但也许有更好的方法。
  • 是的,这就是我提到的原因,但这是 sh 做到这一点的棘手方法,祝 Rezwan 好运。
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 2012-03-04
  • 2011-01-07
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多