Android 我的Bash脚本数组循环中存在问题

Android 我的Bash脚本数组循环中存在问题,android,arrays,bash,shell,Android,Arrays,Bash,Shell,首先,代码如下: # 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_inter

首先,代码如下:

# 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;
现在,最初在循环中,我是这样访问数组的:
prop=$PROPARR[$I];
arg=$PROPVALARR[$i]

但是它在
build.prop
的末尾编写了奇怪的代码,而且它只是数组中的第一项

所以,我试了试,就像我发布的一样,现在我在意外标记“(”

因此,对于我遇到的第一个问题,我认为可以安全地假设#1循环没有正确写入,#2我试图写入的文本没有正确写入,#3是访问项目的正确方式


因此,问题是,我如何解决这个问题,使循环正确地在数组中循环,并将正确的行写入
build.prop
(或者在找到行时更新该行)

如何引用数组值存在一些问题。以下代码应该可以工作

# 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;

还值得注意的是,sed语句的-i选项将随着for循环的每次迭代而被覆盖。因此,在运行此脚本后,您将不会有原始的备份。也许可以在运行脚本之前手动进行备份,或者将其作为脚本的一部分添加进去。

一个更好的解决方案,更干净、更可读,它利用了as社交数组,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;
在这段代码中,我只关注如何在关联数组上循环。 您应该能够将自己的逻辑挂接到循环中

完整参考:


定义一个数组
array=(hello world)
和1.打印第二个元素,2.循环并打印每个元素。当您不熟悉一种语言时,一次解决一个错误,而不是编写一个完整的程序,然后尝试一次解决所有问题,这确实很有帮助。好的,不再有错误,但是它不会将更改写入
build.prop
I w我会尝试你的编辑。不担心备份,是的,这需要根无论如何,因为这发生在自定义恢复中的模组闪烁:)哎呀!现在,它不是修改现有属性,而是附加到它。。。例如:
dalvik.heapstartsize=16m=16m
就是我最终得到的结果。您对该文件运行了两次脚本吗?这将以双重附加结束。好的,我们也可以解决这个问题。将行“sed-i.bak s/$prop/$prop=$arg/$FILE;”修改为“sed-i.bak s/$prop.*/$prop=$arg/$FILE;”。这应该可以解决问题。我已经编辑了帖子-第二个脚本现在有了额外的模式匹配。
declare-A:invalid option
并且我得到了
语法错误:无效的算术运算符(错误标记为“.tcp.buffersize.default”)
其中
.tcp.buffersize.default
对每一行都有更改,但对每一行都会发生:(您的bash版本中不支持关联数组显然不支持。我知道Linux支持关联数组,但我确信Android版bash已经瘫痪