【问题标题】:create variables inside unix script在 Unix 脚本中创建变量
【发布时间】:2015-05-04 19:57:27
【问题描述】:

我正在尝试基于另一个变量在脚本中创建一个变量。

如果可能的话,我只是不知道我的代码中需要调整什么。 为了您的理解,我正在简化我的代码,所以这不是原始代码。

代码是这样的:

#!/bin/csh -f

set list_names=(Albert Bela Corine David)
set Albert_house_number=1
set Bela_house_number=2
set Corine_house_number=3
set David_house_number=4

foreach name ($list_names)
  #following line does not work....
  set house_number=$($name\_house_number)
  echo $house_number
end

所需的输出应该是:

1
2
3
4

感谢您的帮助。

【问题讨论】:

标签: linux unix environment-variables csh


【解决方案1】:

不幸的是,csh 中的bashism ${!varname} 对我们不可用,因此我们必须使用反引号和eval 走老式路线。 csh 的引用规则与符合 POSIX 的 shell 不同,因此所有这些都是 csh 特定的。我们开始:

set house_number = `eval echo \" \$${name}_house_number\"`
echo "$house_number"

${name} 被扩展为反引号命令,因此这相当于,例如,

set house_number = `eval echo \" \$Albert_house_number\"`

然后评估

echo " $Albert_house_number"

并且由于反引号,然后将其输出分配给house_number

\$$ 前面的空格是必须的,以防扩展变量的值对回显有特殊意义(如-n)。我们不能简单地使用echo "-n"(它不会打印任何内容),但是echo " -n" 很好。1

当反引号表达式展开时,额外的空格被csh 剥离。这将我们引向剩下的警告:变量值中的空格将被删除; csh 的反引号就是这样做的。这意味着如果Albert_house_number 被定义为

set Albert_house_number = "3   4"

house_number 最终会得到值3 4(只有一个空格)。我不知道如何防止这种情况。

1 请注意,在这种情况下,echo "$house_number" 行也必须修改,否则即使house_number 具有正确的值,它也会运行echo "-n" 并且不打印任何内容.

【讨论】:

  • 谢谢 Wintermute,这是一个完美的解释,我学到了很多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 2010-12-14
  • 2018-07-18
相关资源
最近更新 更多