【问题标题】:Multiple for loop多个for循环
【发布时间】:2015-03-10 17:03:55
【问题描述】:

我正在尝试编写一个修改文件的脚本。 我想检查文件中定义的文本,如果存在则更改它,如果它不添加它。 要更改的文本在变量中定义:

line1=text string 1
line2=text string 2
line3=text string 3
# new values
line1Arg=value 1
line2Arg=value 2
line3Arg=value 3

到目前为止,我有以下内容:

for i in $line1 $line2 $line3;
do
oldarg=`grep $i $file |cut -d"=" -f2`;
chkexists=`grep -c $i $file`
if [ $chkexists -eq 0 ]; then
cp $file $tmpfile

这就是我卡住的地方... 他对变量 $linexArg 进行循环并将其添加到 $tmpfile?

echo $i='new value' >> $tmpfile;
echo "$i added with newvalue";
else
echo "$i exists with $oldarg";

可能很简单,但我是脚本新手!

编辑 1:

感谢马特,我现在有了这个,它只从 $line1-5 中添加了 1 行,它应该添加 2 个缺失的行,$line4 和 $line5

file=/folder/file
tmpfile=$file.tmp

#  strings to find and modify / add
line1=text string 1
line2=text string 2
line3=text string 3
line4=text string 4
line5=text string 5
# new values
line1Arg=120
line2Arg=370
line3Arg=100
line4Arg=999
line5Arg=1000

for i in $line1 $line2 $line3 $line4 $line5; 
do
result=`grep $i $file`
if [ -z $result ]
then
cp $file $tmpfile
echo $i >> $tmpfile
else
cat $file | sed "s/$i/$newi/g" > $tmpfile
fi
done

我正在努力解决的是如何遍历 2 组变量并以格式添加缺失的字符串 $line1=$line1Arg

编辑 2

所以现在我有以下...

file=/folder/file
tmpfile=$file.tmp

#  strings to find and modify / add
line1=text string 1
line2=text string 2
line3=text string 3
line4=text string 4
line5=text string 5
# new values
line1Arg=120
line2Arg=370
line3Arg=100
line4Arg=999
line5Arg=1000

for i in $line1 $line2 $line3 $line4 $line5;
do
for x in $line1Arg $line2Arg $lineArg $line4Arg $line5Arg;
do

result=`grep $i $file`
oldarg=`grep $i $file |cut -d"=" -f2`

if [ -z $result ]
then
cp $file $tmpfile
echo $i=$x >> $tmpfile
echo "$i added with value $x"

else

if [ "$oldarg" = "$x" ]; then
echo "$i already set - no change"

else
sed "s/$i=.*/$i=${x}/g" $file > $tmpfile
echo "$i changed to value $x"
fi
fi
done

但它没有将所有缺失的 $lineX=$lineXArg 添加到文件中? 我错过了什么?

编辑 3

好的,所以使用 sh -x 我得到以下输出

> root@d802:/ # sh -x /data/local/build.sh
> + file=/sdcard/documents/build.txt
> + tmpfile=/sdcard/documents/build.txt.tmp
> + line1=wifi.supplicant_scan_interval
> + line2=ro.sf.lcd_density
> + line3=ro.media.enc.jpeg.quality
> + line4=rixh.wallace
> + line5=ro.telephony.call_ring.delay
> + line1Arg=120
> + line2Arg=370
> + line3Arg=99999999
> + line4Arg=999
> + line5Arg=1000
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt
> + result='wifi.supplicant_scan_interval=120'
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=120
> + '[' -z 'wifi.supplicant_scan_interval=120' ']'
> + cat /sdcard/documents/build.txt
> + >/sdcard/documents/build.txt.tmp
> + sed 's/wifi.supplicant_scan_interval=120/wifi.supplicant_scan_interval=120/g'
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt
> + result='wifi.supplicant_scan_interval=120'
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=120
> + '[' -z 'wifi.supplicant_scan_interval=120' ']'
> + >/sdcard/documents/build.txt.tmp
> + cat /sdcard/documents/build.txt
> + sed 's/wifi.supplicant_scan_interval=120/wifi.supplicant_scan_interval=370/g'
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt
> + result='wifi.supplicant_scan_interval=120'
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=120
> + '[' -z 'wifi.supplicant_scan_interval=120' ']'
> + >/sdcard/documents/build.txt.tmp
> + sed 's/wifi.supplicant_scan_interval=120/wifi.supplicant_scan_interval=999/g'
> + cat /sdcard/documents/build.txt
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt
> + result='wifi.supplicant_scan_interval=120'
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=120
> + '[' -z 'wifi.supplicant_scan_interval=120' ']'
> + cat /sdcard/documents/build.txt
> + >/sdcard/documents/build.txt.tmp
> + sed 's/wifi.supplicant_scan_interval=120/wifi.supplicant_scan_interval=1000/g'
> + grep ro.sf.lcd_density /sdcard/documents/build.txt
> + result='ro.sf.lcd_density=370'
> + grep ro.sf.lcd_density /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=370
> + '[' -z 'ro.sf.lcd_density=370' ']'
> + cat /sdcard/documents/build.txt
> + >/sdcard/documents/build.txt.tmp
> + sed 's/ro.sf.lcd_density=370/ro.sf.lcd_density=120/g'
> + grep ro.sf.lcd_density /sdcard/documents/build.txt
> + result='ro.sf.lcd_density=370'
> + grep ro.sf.lcd_density /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=370
> + '[' -z 'ro.sf.lcd_density=370' ']'
> + cat /sdcard/documents/build.txt
> + >/sdcard/documents/build.txt.tmp
> + sed 's/ro.sf.lcd_density=370/ro.sf.lcd_density=370/g'
> + grep ro.sf.lcd_density /sdcard/documents/build.txt
> + result='ro.sf.lcd_density=370'
> + grep ro.sf.lcd_density /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=370
> + '[' -z 'ro.sf.lcd_density=370' ']'
> + cat /sdcard/documents/build.txt
> + >/sdcard/documents/build.txt.tmp
> + sed 's/ro.sf.lcd_density=370/ro.sf.lcd_density=999/g'
> + grep ro.sf.lcd_density /sdcard/documents/build.txt
> + result='ro.sf.lcd_density=370'
> + grep ro.sf.lcd_density /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=370
> + '[' -z 'ro.sf.lcd_density=370' ']'
> + cat /sdcard/documents/build.txt
> + >/sdcard/documents/build.txt.tmp
> + sed 's/ro.sf.lcd_density=370/ro.sf.lcd_density=1000/g'
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt
> + result='ro.media.enc.jpeg.quality=100'
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=100
> + '[' -z 'ro.media.enc.jpeg.quality=100' ']'
> + cat /sdcard/documents/build.txt
> + >/sdcard/documents/build.txt.tmp
> + sed 's/ro.media.enc.jpeg.quality=100/ro.media.enc.jpeg.quality=120/g'
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt
> + result='ro.media.enc.jpeg.quality=100'
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=100
> + '[' -z 'ro.media.enc.jpeg.quality=100' ']'
> + cat /sdcard/documents/build.txt
> + >/sdcard/documents/build.txt.tmp
> + sed 's/ro.media.enc.jpeg.quality=100/ro.media.enc.jpeg.quality=370/g'
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt
> + result='ro.media.enc.jpeg.quality=100'
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=100
> + '[' -z 'ro.media.enc.jpeg.quality=100' ']'
> + cat /sdcard/documents/build.txt
> + >/sdcard/documents/build.txt.tmp
> + sed 's/ro.media.enc.jpeg.quality=100/ro.media.enc.jpeg.quality=999/g'
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt
> + result='ro.media.enc.jpeg.quality=100'
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=100
> + '[' -z 'ro.media.enc.jpeg.quality=100' ']'
> + cat /sdcard/documents/build.txt
> + >/sdcard/documents/build.txt.tmp
> + sed 's/ro.media.enc.jpeg.quality=100/ro.media.enc.jpeg.quality=1000/g'
> + grep rixh.wallace /sdcard/documents/build.txt
> + result=
> + grep rixh.wallace /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=
> + '[' -z ']'
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp
> + >>/sdcard/documents/build.txt.tmp
> + echo 'rixh.wallace=120'
> + grep rixh.wallace /sdcard/documents/build.txt
> + result=
> + grep rixh.wallace /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=
> + '[' -z ']'
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp
> + >>/sdcard/documents/build.txt.tmp
> + echo 'rixh.wallace=370'
> + grep rixh.wallace /sdcard/documents/build.txt
> + result=
> + grep rixh.wallace /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=
> + '[' -z ']'
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp
> + >>/sdcard/documents/build.txt.tmp
> + echo 'rixh.wallace=999'
> + grep rixh.wallace /sdcard/documents/build.txt
> + result=
> + grep rixh.wallace /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=
> + '[' -z ']'
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp
> + >>/sdcard/documents/build.txt.tmp
> + echo 'rixh.wallace=1000'
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt
> + result=
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=
> + '[' -z ']'
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp
> + >>/sdcard/documents/build.txt.tmp
> + echo 'ro.telephony.call_ring.delay=120'
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt
> + result=
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=
> + '[' -z ']'
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp
> + >>/sdcard/documents/build.txt.tmp
> + echo 'ro.telephony.call_ring.delay=370'
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt
> + result=
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=
> + '[' -z ']'
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp
> + >>/sdcard/documents/build.txt.tmp
> + echo 'ro.telephony.call_ring.delay=999'
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt
> + result=
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt
> + cut '-d=' -f2
> + oldarg=
> + '[' -z ']'
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp
> + >>/sdcard/documents/build.txt.tmp
> + echo 'ro.telephony.call_ring.delay=1000'

编辑 4

当前代码:

#/system/bin/sh

file=/sdcard/documents/build.txt
tmpfile=$file.tmp


# props to change

line1=wifi.supplicant_scan_interval

line2=ro.sf.lcd_density

line3=ro.media.enc.jpeg.quality

line4=rixh.wallace

line5=ro.telephony.call_ring.delay


# new values

line1Arg=120

line2Arg=480

line3Arg=99999999

line4Arg=999

 line5Arg=6666666666666



for i in $line1 $line2 $line3 $line4 $line5; do

for x in $line1Arg $line2Arg $lineArg $line4Arg $line5Arg; do

result=`grep $i $file`
oldarg=`grep $i $file |cut -d"=" -f2`

if [ -z $result ]
then
cp $file $tmpfile
echo $i=$x >> $tmpfile;
echo "$i added with value $x"
else
cat $file | sed "s/$i=$oldarg/$i=$x/g"> $tmpfile
echo "$i edited to $x"

fi

done
done

和输出:

ro.telephony.call_ring.delay added with value 6666666666666
wifi.supplicant_scan_interval edited to 120
wifi.supplicant_scan_interval edited to 480
wifi.supplicant_scan_interval edited to 999
wifi.supplicant_scan_interval edited to 6666666666666
ro.sf.lcd_density edited to 120
ro.sf.lcd_density edited to 480
ro.sf.lcd_density edited to 999
ro.sf.lcd_density edited to 6666666666666
ro.media.enc.jpeg.quality edited to 120
ro.media.enc.jpeg.quality edited to 480
ro.media.enc.jpeg.quality edited to 999
ro.media.enc.jpeg.quality edited to 6666666666666
rixh.wallace added with value 120
rixh.wallace added with value 480
rixh.wallace added with value 999
rixh.wallace added with value 6666666666666
ro.telephony.call_ring.delay added with value 120
ro.telephony.call_ring.delay added with value 480
ro.telephony.call_ring.delay added with value 999
 ro.telephony.call_ring.delay added with value 6666666666666

【问题讨论】:

  • sed -i 's/text string/value/' file 有什么问题?
  • @glennjackman 我更喜欢写入临时文件,所以我可以检查所做的更改,然后将临时文件复制到 $file
  • sed 's/text string/value/' file > file.new
  • @glennjackman 对不起,我缺乏知识,但你能详细说明一下吗?
  • 如果不是太多工作,你能提供一些示例输入/输出吗?特别是在问题部分?

标签: shell variables for-loop scripting


【解决方案1】:

让我们试试这个

#/system/bin/sh

file=/sdcard/documents/build.txt
tmpfile=$file.tmp


# props to change

line1=wifi.supplicant_scan_interval
line2=ro.sf.lcd_density
line3=ro.media.enc.jpeg.quality
line4=rixh.wallace
line5=ro.telephony.call_ring.delay


# new values

line1Arg=120
line2Arg=480
line3Arg=99999999
line4Arg=999
line5Arg=6666666666666

linex=$line1,$line2,$line3,$line4,$line5    

for x in $line1Arg $line2Arg $lineArg $line4Arg $line5Arg; do

#might need to be -f0, I forget syntax
i=`echo $linex | cut -d"," -f1`

#this is from some code I found online, not sure if it's right.
linex=${linex#*,}

result=`grep $i $file`
oldarg=`grep $i $file |cut -d"=" -f2`

if [ -z $result ]
then
cp $file $tmpfile
echo $i=$x >> $tmpfile;
echo "$i added with value $x"
else
cat $file | sed "s/$i=$oldarg/$i=$x/g"> $tmpfile
echo "$i edited to $x"

fi

done
done

老东西

首先 grep 来查看文件(或字符串或其他)是否包含您的值

 result=`grep $i $file`
 if [ -z $result ] 
 then
 cp $file $newfile
 echo "$i" >> $newfile
 else
 cat $file | sed "s/$i/$newi/g" > $newfile
 fi

在这种情况下,sed 命令包含“s”用于替换,旧字符串、新字符串和“g”用于全局执行(而不是每个文件/行/等一次)。如果文件中不包含它,我还修改了它添加您的价值的方式。 -z 检查字符串的长度是否为零(如果 grep 没有返回任何内容)并且 >> 附加到文件的末尾。

编辑:

另外,离开 cmets,我觉得我应该解释一下“|” , ">" 和 ">>"

“|”管道,管道输出到另一个函数。也就是说,它使用管道左侧命令的 stdOut 输出作为管道右侧命令的 stdIn 输入。如果未指定输入文件,许多 shell 命令使用 stdIn。这非常适合将命令链接在一起。

">" 重定向,将输出重定向到文件而不是 stdOut。如果(就像您的情况一样)您想将输出移动到文件中,这很有用,而不仅仅是将其放在控制台中。不过,这将从头开始写入文件,有效地覆盖重定向到的文件输出。

">>" append,将信息附加到文件的末尾,而不是在 stdOut 中显示。这意味着该文件可以持久存在,但也可以向其中添加程序的输出。如果您需要在文件末尾添加更多内容,这很有用。

可能很难看出哪里有用,但我希望它至少能阐明它们的工作原理以及我为什么选择在回答您的问题时使用它们。

编辑2: 在代码中添加了“then”,我认为这是如何表示结构化的“if”语句(例如 if-else),而不仅仅是一个简单的 if(只是 if,没有 else)。我的 shell 编程有点生疏,希望对您有所帮助。

编辑3: 将 end-if 更改为 fi (因为这是 shell 中的正确语法。还将 $i 更改为 Echo $i ,因为重定向指示命令的输出。

如果您需要在其中放置一个循环,其中 $i 是要在 $linexarg 中匹配的每个变量,它看起来像这样

for i in $linexarg
do
#above code
done 

Here 是我用来确定的参考。

编码愉快!如果您有任何问题,请发表评论。

【讨论】:

  • 好的。我想也许我不够具体。您的代码从 $file presumebaly 返回 'missing text missing'...。我想要的是在文件丢失时附加文件的末尾。如果 $file 丢失,我还想将“$line1=$line1Arg”添加到 $file 中?
  • 我的代码假定在 $file 中设置了文件路径。你执行的时候是这样的吗?
  • 是的,它是亚光的。我不得不稍微改变它才能让它工作。我不得不将 $i >> $tmpfile 更改为 echo $i >> $tmpfile。但它不会添加所有丢失的条目。其次,我如何循环 $linexArg 以添加它们。格式为 $line1=$line1Arg ?
  • 添加了更多 sh -x 细节
  • 这似乎工作@Matt。非常感谢。如果 $lineXArg 已经设置为脚本中指定的内容,是否仍然不进行编辑?我还必须删除一个完成命令,因为我收到“意外完成”错误
【解决方案2】:
sed 's/text string/value/' file > file.new

sed 是一个“流编辑器”——你将文件甚至通过管道传递给它,它可以以图灵数的方式操作文本。该程序读取文件(逐行),使用s/// 命令搜索正则表达式“文本字符串”,并将每行的第一个实例替换为文本“值”。

【讨论】:

    猜你喜欢
    • 2021-09-17
    • 1970-01-01
    • 2016-05-24
    • 2015-10-15
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2013-12-10
    相关资源
    最近更新 更多