2015-04-26 105 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')。 –