2017-08-28 118 views
0

我正在处理一个项目,其中需要根据某个文件中包含的数字来分配变量。我觉得包括并解释所有代码可能毫无意义,所以我已经将问题简化为涉及一个简单示例的问题。Bash:循环变量相关的赋值和引用

for ((i=1; i<=3; i++)); 
do 
    align_$i=100_$i 
done 

在这个例子中的代码,我收到以下错误(另2间):

line 3: align_1=100_1: command not found 

,所以我知道我的方法替代工作,但它没有被识别为正确分配。我清楚地犯了一个简单的错误,但真的不知道如何解决这个问题。

有点不同的想法:我有一个问题调用变量的值,其中变量双重依赖于循环变量。 因此,使用从上面的例子中假定正确的输出,如果我在另一个循环,我需要调用align_1的价值,但需要做的这么喜欢

for ((i=1; i<=3; i++)); 
    do something with $align_$i 

我将如何正确地做到这一点?使用这些变量必须在另一个循环中,否则我不会有这个问题!

我对一个简单的问题表示歉意 - Bash不是我的力量。

谢谢

+1

这可以说是我们关于间接分配和/或扩展的许多问题的重复。 –

+0

特别参见[BashFAQ#6](http://mywiki.wooledge.org/BashFAQ/006)。 –

回答

2

最佳答案:不要

,如果你使用一个数组(或关联数组与非数字键)一般可避免的需要这样的:

align=() 
for ((i=1; i<=3; i++)); do 
    align[$i]="100_$i" 
done 

但是如果你必须......

巴蜀4.3+

namevar允许在别名变量名下完全双向访问(包括读取和写入);别名目标可以是任何类型的,包括数组本身:

for ((i=1; i<3; i++)); do 
    declare -n align_var="align_$i" 
    align_var="100_$i" 
    unset -n align_var 
done 

在旧版本

...如果你有bash的4.3或更高版本,使用printf -v

for ((i=1; i<3; i++)); do 
    printf -v "align_$i" %s "100_$i" 
done 
+0

非常感谢,尽管重复的问题!你正在帮助新手Bash程序员找到与白血病有关的基因:) – xcpat