我正在尝试根据另一个变量在脚本中创建一个变量。
如果有可能,我只是不知道我的代码需要调整哪些内容。 我正在简化我的代码以便您理解,因此这不是原始代码。
代码就是这样:
#!/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
感谢您的帮助。
答案 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}具有正确的值。