求助 : 有个关于脚本中变量的问题,麻烦大家帮下忙

求助 : 有个关于脚本中变量的问题,麻烦大家帮下忙

现在碰到一个问题
用C编写的一个程序make后 叫 diag , 可执行文件
还有一个参数表 叫 inf

即这样执行 ./diag inf >> results

然后从 results 里看结果

现在碰到一个麻烦, 就是我需要不断改变参数表里的参数取值, 比如 一个 叫 gp 的参数 , 要它从 0 变到 1000

因为每次都手工修改很麻烦, 我想编个小脚本能实现 自动修改 inf 文件 , 保存 , 并执行

实际写的时候发现, 在脚本里定义的变量, 是无法影响到 inf 文件里的值的, 这几天一直不知道该怎么做, 希望大家帮帮忙

以下是我写的小脚本
复制内容到剪贴板
代码:

#!/bin/bash

declare -i a
declare -i b=0

for (( a=0; a<=1000; b=a+1))
do
vi -c ':1,$s/gp=$a/gp=$b' -c ':wq' inf <==其中 "gp=?" 是 inf 文件中需要修改的地方
a=b
./diag inf >> results
done
我也试过用 export , 比如

declare ......

export a
export b

for ......

但发现没有用, 我知道肯定是不能直接用脚本里的变量影响打开文件里的, 但不知道到底该怎么办, 希望大家部吝赐教, 不胜感激

还有,似乎用脚本读入inf文件,再处理可以,但读入后如何循环改变gp的值呢      
复制内容到剪贴板
代码:
#!/bin/bash

declare -i a
declare -i b=0

for (( a=0; a<=1000; a++))
do
sed -i "s/pg=.*/pg=$a/" inf
./diag inf >> results
done
      
[quote=li-jiahuan;573192]
复制内容到剪贴板
代码:
#!/bin/bash

declare -i a
declare -i b=0

for (( a=0; a<=1000; a++))
do
sed -i "s/pg=.*/pg=$a/" inf
./diag inf >> results
done
[/quote]

哇噻,太感谢了!!
真是太棒了,这下就能出论文了,哈哈哈哈
谢谢啦!!!      
[quote=li-jiahuan;573192]
复制内容到剪贴板
代码:
#!/bin/bash

declare -i a
declare -i b=0

for (( a=0; a<=1000; a++))
do
sed -i "s/pg=.*/pg=$a/" inf
./diag inf >> results
done
[/quote]

不好意思,还有一个麻烦

因为我实际用到的inf 文件一行有很多的数据,

比如这样
gp=0 gpp=1 kp=2

这些参数都是有用的,但执行这个命令
sed -i "s/...." inf

后,比如改变 gp 的值,这时再打开 inf 文件会发现, gp=? 那项后边全部都没有了,只剩下一行
gp=0

我查了查关于sed的资料,发现上面的命令就是单纯替换用的,而不会删除什么,难道是我的linux有问题?我的是FC3,不过也太奇怪了

谁能帮我解释下呢?谢谢      
sed -i "s/pg=.*/pg=$a/" inf 当然会把 pg=后的内容全都替换成$a的值

假设该行后边还有以空格分隔的数据
perl -pi -e "s/pg=\w+? /pg=$a/" inf      
[quote=li-jiahuan;573270]sed -i "s/pg=.*/pg=$a/" inf 当然会把 pg=后的内容全都替换成$a的值

假设该行后边还有以空格分隔的数据
perl -pi -e "s/pg=\w+? /pg=$a/" inf[/quote]

我试了试,发现还是不行
两个问题
1、在\w+? /pg中的?和/之间有一个空格,执行语句后
原inf文件中的 gp=0 gpp=1 kp=2
变为              gp=1gpp=1 kp=2
即gp和gpp之间的空格被删除了,这样数据就没法用了
2、所以我就把\w+? /pg之间的空格删掉,改为\w+?/pg,这下就可以了
但发现当gp的赋值数字为2位以上时,执行后只会改变最靠近等号的那1位数字
如 一个gp从1到20的循环,则为
gp=1
gp=2
gp=3
gp=4
gp=5
gp=6
gp=7
gp=8
gp=9
gp=10
gp=110
gp=120
gp=130
gp=140
gp=150
gp=160
gp=170
gp=180
gp=190
gp=2090

请问huanhuan版大,还有办法吗
真是谢谢你啦,麻烦您这么多,都有些不好意思了,呵呵[IMG]http://www.linuxeden.com/forum/images/icons/icon10.gif[/IMG]      
我写的小脚本
复制内容到剪贴板
代码:
#!/bin/bash

declare -i a
declare -i b
declare -i c

for (( a=0;a<=1;a=a+1 ))
do
{
perl -pi -e "s/gp=\w+?/gp=$a/" inf
for (( b=0;b<=1;b=b+1 ))
  do
  {
  perl -pi -e "s/gpp=\w+?/gpp=$b/" inf
  for (( c=0;c<=11;c=c+1 ))
    do
    {
    perl -pi -e "s/kp=\w+?/kp=$c/" inf
    ./../diag/diag inf >> results
    }
    done
  }
  done
}
done
还有传说中的inf文件内容
复制内容到剪贴板
代码:
Np = 4 Nn = 0
gp=10 gn=0 gpp=0.04 gpn=0 kp=0.1 kn=0 kappa=0 sp=0 sn=0 alpha1=0
glp=1.1 gln=-0.1 gsp= 3.91 gsn=-2.678
diag 8
amp 0
BE2 1.0 0
EXP 0.0
2.1 0.1
4.1 2.1
0.2 2.2
0.2 2.1
6.1 4.1
我需要改变gp、gpp和kp的值,而保持其它不变
主要目的就是取代手工操作
希望能让您理解的更透彻些,多谢啦      
终于搞出来了,不过感觉方法很笨,一开始是想修改inf文件,但总不成功,后来换了种思路,完全重建inf文件,每次运行前都重建一个,这样就完全可控了

我是用数组实现的,现在放出来让大家看看
复制内容到剪贴板
代码:
#!/bin/bash

declare -i a b c
declare -a inf
inf[0]='Np=4 Nn=0'
#inf[1]="gp=$a gn=0 gpp=$b gpn=0 kp=$c kn=0 kappa=0 sp=0 sn=0 alpha1=0"
#     上面这句必须放到下面,因为这时没给变量a,b,c赋值,所以gp,gpp,kp也无法赋值
inf[2]='glp=1.1 gln=-0.1 gsp=3.91 gsn=-2.678'
inf[3]='diag 8'
inf[4]='amp 0'
inf[5]='BE2 1.0 0'
inf[6]='EXP 0.0'
inf[7]='2.1 0.1'
inf[8]='4.1 2.1'
inf[9]='0.2 2.2'
inf[10]='0.2 2.1'
inf[11]='6.1 4.1'

for (( a=0;a<=1;a++ ))
do
{
  for (( b=0;b<=1;b++ ))
  do
  {
    for (( c=0;c<=100;c++ ))
    do
      {
       inf[1]="gp=$a gn=0 gpp=$b gpn=0 kp=$c kn=0 kappa=0 sp=0 sn=0 alpha1=0"
       sed -i "1s/.*/${inf[0]}/" inf
       sed -i "2s/.*/${inf[1]}/" inf
       sed -i "3s/.*/${inf[2]}/" inf
       sed -i "4s/.*/${inf[3]}/" inf
       sed -i "5s/.*/${inf[4]}/" inf
       sed -i "6s/.*/${inf[5]}/" inf
       sed -i "7s/.*/${inf[6]}/" inf
       sed -i "8s/.*/${inf[7]}/" inf
       sed -i "9s/.*/${inf[8]}/" inf
       sed -i "10s/.*/${inf[9]}/" inf
       sed -i "11s/.*/${inf[10]}/" inf
       sed -i "12s/.*/${inf[11]}/" inf
       ./../diag/diag inf >> pp
      }
    done
  }
  done
}
done
别管怎样,已经比我手工修改inf,再运行程序要好的多了,如果哪位朋友有更好的方法请告诉我

在此,再次感谢huanhuan版主,谢谢你的帮忙,因为有你和dearvoid在,所以这个区比任何我到过的linux论坛都热情,都有人情味
谢谢啦!      
不好意思,这两天有些忙

少了一个空格
perl -pi -e "s/pg=\w+? /pg=$a /" inf

Perl的 s/// 与 sed的 s///基本一样
只是正则式更强大些(当然不只这么简单)
使用Perl的s///是因为避免贪婪匹配,不是显摆:)