2014-06-26 70 views
0

第一件事,這裏是代碼:有在我的bash腳本數組循環的問題首先

# build.prop Tweaks 
FILE=/system/build.prop 
#Properties to change Array 
PROPARR=('net.tcp.buffersize.default' 'net.tcp.buffersize.wifi' 'net.tcp.buffersize.umts' 'net.tcp.buffersize.gprs' 'net.tcp.buffersize.edge' 'wifi.supplicant_scan_interval' 'ro.HOME_APP_ADJ' 'dalvik.vm.dexopt-flags' 'dalvik.vm.execution-mode' 'dalvik.vm.heapstartsize' 'dalvik.vm.heapgrowthlimit' 'dalvik.vm.heapsize' 'dalvik.vm.heaptargetutilization' 'dalvik.vm.heapminfree' 'dalvik.vm.heapmaxfree' 'debug.sf.hw'); 
#Property Values 
PROPVALARR=('4096,87380,256960,4096,16384,256960' '4096,87380,256960,4096,16384,256960' '4096,87380,256960,4096,16384,256960' '4096,87380,256960,4096,16384,256960' '4096,87380,256960,4096,16384,256960' '300' '1' 'm=y,v=n,o=v,u=n' 'init:jit' '16m' '128m' '512m' '0.75' '12m' '16m' '1'); 
# this variable is just a place holder for the future line number of the prop values 
lineNum= 
# Loop through the properties I want to change 
for i in $PROPARR; do 

prop=$PROPARR($i); 
arg=$PROPVALARR($i); 
if grep -Fq $prop $FILE ; then 
     lineNum=`sed -n "/${prop}/=" $FILE`; 
     sed -i "${lineNum} c${prop}=${arg}" $FILE; 
else 
     echo $prop=$arg >> $FILE; 
fi; 

done; 

現在,orignally的循環,我訪問這樣的數組:prop=$PROPARR[$i]; arg=$PROPVALARR[$i];

但它被寫奇怪的代碼的build.prop末,它是唯一的數組(S)

所以,後來我想它就像我張貼在第一個項目,現在我得到一個syntax error near unexpected token '('

因此,在我遇到的第一個問題中,我認爲假設#1循環未被正確寫入是安全的,#2我正嘗試寫入的文本寫入錯誤,#3是正確的方式訪問項目

所以,問題是,我怎麼能解決這個問題,因此該循環正確遍歷數組,並寫入適當的行build.prop(或更新,如果發現線路)

+0

定義自己的陣列'陣列=(世界你好)'和1.打印第二元件,2.遍歷並打印每個元素。當你對某種語言不熟悉時,確實有助於從小處着手並一次性修正一個錯誤,而不是編寫一個完整的程序,然後嘗試一次修復所有內容。 –

回答

1

有一些問題你如何引用數組值。下面的代碼應該可以工作。

# build.prop Tweaks 
FILE=/System/build.prop 
#Properties to change Array 
PROPARR=('net.tcp.buffersize.default' 'net.tcp.buffersize.wifi' 'net.tcp.buffersize.umts' 'net.tcp.buffersize.gprs' 'net.tcp.buffersize.edge' 'wifi.supplicant_scan_interval' 'ro.HOME_APP_ADJ' 'dalvik.vm.dexopt-flags' 'dalvik.vm.execution-mode' 'dalvik.vm.heapstartsize' 'dalvik.vm.heapgrowthlimit' 'dalvik.vm.heapsize' 'dalvik.vm.heaptargetutilization' 'dalvik.vm.heapminfree' 'dalvik.vm.heapmaxfree' 'debug.sf.hw'); 
#Property Values 
PROPVALARR=('4096,87380,256960,4096,16384,256960' '4096,87380,256960,4096,16384,256960' '4096,87380,256960,4096,16384,256960' '4096,87380,256960,4096,16384,256960' '4096,87380,256960,4096,16384,256960' '300' '1' 'm=y,v=n,o=v,u=n' 'init:jit' '16m' '128m' '512m' '0.75' '12m' '16m' '1'); 
# this variable is just a place holder for the future line number of the prop values 
lineNum= 
# Loop through the properties I want to change 
for i in ${!PROPARR[@]}; do 
    prop=${PROPARR[$i]}; 
    arg=${PROPVALARR[$i]}; 
    if grep -Fq $prop $FILE ; then 
     lineNum=`sed -n "/${prop}/=" $FILE`; 
     sed -i "${lineNum} c${prop}=${arg}" $FILE; 
    else 
     echo $prop=$arg >> $FILE; 
    fi; 
done; 

編輯:好的,您還需要對您的sed語句進行一些更改。還要編寫/ System /你需要root權限。以下是更新後的代碼:

# build.prop Tweaks 
FILE=/System/build.prop 
#Properties to change Array 
PROPARR=('net.tcp.buffersize.default' 'net.tcp.buffersize.wifi' 'net.tcp.buffersize.umts' 'net.tcp.buffersize.gprs' 'net.tcp.buffersize.edge' 'wifi.supplicant_scan_interval' 'ro.HOME_APP_ADJ' 'dalvik.vm.dexopt-flags' 'dalvik.vm.execution-mode' 'dalvik.vm.heapstartsize' 'dalvik.vm.heapgrowthlimit' 'dalvik.vm.heapsize' 'dalvik.vm.heaptargetutilization' 'dalvik.vm.heapminfree' 'dalvik.vm.heapmaxfree' 'debug.sf.hw'); 
#Property Values 
PROPVALARR=('4096,87380,256960,4096,16384,256960' '4096,87380,256960,4096,16384,256960' '4096,87380,256960,4096,16384,256960' '4096,87380,256960,4096,16384,256960' '4096,87380,256960,4096,16384,256960' '300' '1' 'm=y,v=n,o=v,u=n' 'init:jit' '16m' '128m' '512m' '0.75' '12m' '16m' '1'); 
# this variable is just a place holder for the future line number of the prop values 
# Loop through the properties I want to change 
for i in ${!PROPARR[@]}; do 
    prop=${PROPARR[$i]}; 
    arg=${PROPVALARR[$i]}; 
    if grep -Fq $prop $FILE ; then 
     sed -i.bak s/$prop.*/$prop=$arg/ $FILE; 
    else 
     echo $prop=$arg >> $FILE; 
    fi; 
    echo "$prop $arg" 
done; 

還值得一提的是,-i選項sed的聲明將與循環的每次迭代被覆蓋。因此,在運行此腳本後,您將無法備份原始文件。也許在運行腳本之前手動進行備份或將其作爲其一部分添加進去。

+0

好吧,沒有更多的錯誤,但它不會寫入'build.prop'的更改 – Kevin

+0

我會嘗試編輯。不擔心備份,是的,無論如何這需要根源,因爲在定製恢復模塊的閃爍期間發生這種情況:) – Kevin

+0

YIKES!現在,而不是對現在正在追加的退出屬性進行調試......例如:'dalvik.heapstartsize = 16m = 16m'就是我最後的結果 – Kevin

1

利用關聯數組(Bash中內置的功能)的更好的解決方案,更乾淨,更易讀。

declare -A PROPERTIES 
PROPERTIES['net.tcp.buffersize.default']="4096,87380,256960,4096,16384,256960" 
PROPERTIES['net.tcp.buffersize.wifi']="4096,87380,256960,4096,16384,256960" 
PROPERTIES['net.tcp.buffersize.umts']="4096,87380,256960,4096,16384,256960" 
PROPERTIES['net.tcp.buffersize.gprs']="4096,87380,256960,4096,16384,256960" 
PROPERTIES['net.tcp.buffersize.edge']="4096,87380,256960,4096,16384,256960" 
PROPERTIES['wifi.supplicant_scan_interval']=300 
PROPERTIES['ro.HOME_APP_ADJ']=1 
PROPERTIES['dalvik.vm.dexopt-flags']=m=y,v=n,o=v,u=n 
PROPERTIES['dalvik.vm.execution-mode']=init:jit 
PROPERTIES['dalvik.vm.heapstartsize']=16m 
PROPERTIES['dalvik.vm.heapgrowthlimit']=128m 
PROPERTIES['dalvik.vm.heapsize']=512m 
PROPERTIES['dalvik.vm.heaptargetutilization']=0.75 
PROPERTIES['dalvik.vm.heapminfree']=12m 
PROPERTIES['dalvik.vm.heapmaxfree']=16m 
PROPERTIES['debug.sf.hw']=1 

# Loop through the properties I want to change 
for prop in ${!PROPERTIES[@]}; do 

    arg=${PROPERTIES["$prop"]} 
    echo $prop = $arg 

done; 

在這個片段中,我只關注如何遍歷關聯數組。 你應該能夠將自己的邏輯掛鉤到循環中。

對於一個完整的參考:

http://www.gnu.org/software/bash/manual/bashref.html#Arrays

+0

'聲明-A:無效的選項',並得到'語法錯誤:無效的算術運算符(錯誤標記爲「.tcp.buffersize.default」)'.tcp。buffersize.default'每行改變,但它發生在每行 – Kevin

+0

:(沒有關聯陣列支持您的bash版本 –

+0

顯然不是。我知道有Linux,但我敢肯定bash for Android是殘缺的 – Kevin