在unix脚本

时间:2015-05-04 10:05:06

标签: linux unix environment-variables csh

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

如果有可能,我只是不知道我的代码需要调整哪些内容。 我正在简化我的代码以便您理解,因此这不是原始代码。

代码就是这样:

#!/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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

很遗憾,我们bash无法使用${!varname}主义csh,因此我们必须使用反引号和{{1}进入旧式路线}。 eval的引用规则与符合POSIX的shell的引用规则不同,因此所有这些都是csh特定的。我们走了:

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"没问题。 1

当扩展反引号表达式时,额外空格被echo " -n"剥离。这导致我们剩下的警告:变量值中的空格将被剥离; csh的反叛就是这样做的。这意味着如果将csh定义为

Albert_house_number

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

1 请注意,在这种情况下,3 4行也必须进行修改,否则它将运行echo "$house_number"并且不打印任何内容,即使{{1}具有正确的值。