2015-04-26 107 views
0

考虑到for循环的情况, Loop1,一个整数将被存储在一个名为var1的变量中。 Loop2中,另一个整数将替换var1中的值。 以上不是我想要的。 我想将第二个整数存储到一个名为var2的新变量中。 这个循环将循环30个循环,如果我可以让var1到var30都有不同的变量,那将会非常棒。感谢Bash存储变量,如for循环内

我的代码

b=1 
for i in `ls RQ=RECORD\&rank=*.html | sort -V` 
do 


    tallyimpact=$(sed -n 's/.*has an Impact Factor of <strong>\(.*\)<\/strong>.*/\1/ip;T;q' $i) 
    var$b=$tallyimpact 
    let "b++" 
    blah blah blah 
    blah blah blah 
done 

我得到的是

boxplot2.sh: line 22: var1=162.500: command not found 
boxplot2.sh: line 22: var2=54.420: command not found 
boxplot2.sh: line 22: var3=45.661: command not found 
boxplot2.sh: line 22: var4=42.860: command not found 
boxplot2.sh: line 22: var5=42.351: command not found 
boxplot2.sh: line 22: var6=41.392: command not found 
+0

打开bash的manpage,搜索“Arrays”。 – Wintermute

回答

1

你的意思是这样的?

for i in $(seq 30); do 
    let var$i=$i*$i 
done 

其结果将是:

var1=1 
var2=4 
var3=9 
... 
+0

+1给予OP他要求的东西。 。 。尽管这可能不是他真正需要的东西。一个数组会更合适。 – ruakh

+0

'let'只适用于需要做算术的情况;否则,你需要'declare'。 – chepner

+0

让我们实际上帮助我增加$ i(我称它为$ b,所以我将从现在开始使用它)。 从逻辑上讲,我认为我的命令是正确的,因为每次循环流动时,都应该将一个唯一的整数保存到var $ b但由于某种原因,它只是不接受我的命令。 –

0

bash的索引数组是专门适合你的描述。在外部循环中,var1的值可以设置为您喜欢的任何值。在内部循环中,所有值(不论类型)都可以存储在数组中,并可在设置时使用。这允许在整个外部循环中保留var1的值。一个简单的例子(输出修整为了简洁):

#!/bin/bash 

declare -a array 

for ((i = 1; i < 3; i++)); do 

    var1=$i        ## set var1 to some value 

    for ((j = 0; j < 30; j++)); do 
     array+=($((i * j)))   ## fill the array '+=' adds each 
    done        ## value to the next array element 

    printf "\n var1 : %d\n" "$var1"  ## output all values 
    for ((j = 0; j < ${#array[@]}; j++)); do 
     printf " array[%2d] : %d\n" "$j" "${array[j]}" 
    done 

    unset array       ## unset/reset array 

done 

输出

$ bash array_var1.sh 

var1 : 1 
    array[ 0] : 0 
    array[ 1] : 1 
    array[ 2] : 2 
    array[ 3] : 3 
    array[ 4] : 4 
    array[ 5] : 5 
    array[ 6] : 6 
    array[ 7] : 7 
    array[ 8] : 8 
    array[ 9] : 9 
    array[10] : 10 
    <snip> 

var1 : 2 
    array[ 0] : 0 
    array[ 1] : 2 
    array[ 2] : 4 
    array[ 3] : 6 
    array[ 4] : 8 
    array[ 5] : 10 
    array[ 6] : 12 
    array[ 7] : 14 
    array[ 8] : 16 
    array[ 9] : 18 
    array[10] : 20 
    <snip> 

注:阵列是unset在每个外环的端部,以防止其从保持设置的值在循环内。

+0

我不太确定这是否会有所帮助,因为我真正需要的是在不断变化的变量中自动添加到var1中的一些数字,这被认为是第一个循环。第二个循环,同样不断变化的变量中的数字也会改变,因此它会自动存储在var2中。我的下一个任务是将var1中的值与另一个脚本的另一个var1进行比较。也许如果我可以将值自动存储到数组中,那也可以帮助很多。 –

+0

是的,你正在考虑沿着正确的路线。一般在外循环中,设置'var1 = something',然后检查if((i> 0));然后'比较'((var1 == oldvar1))'(如果是数字)或'if [“$ var1”=“$ oldvar1”]',那么在循环结束时,在下一次迭代设置'oldvar1 = “$ VAR1”'。这样,您可以在每次迭代中测试'var1'的值与之前的值。 (在循环之前初始化'oldvar1')如果您需要在**脚本之间比较**,则需要通过将值写入临时文件,使脚本之间的值保持持久。 (见:man mktemp')。 –