个人尝试得到,备忘,如有转载,请注明作者和出处。

——by realasking

很久没有写脚本了,今天处理数据,又写脚本,结果写着写着突然发现直接用了很多如x,y,z之类的变量名,结果就不如定义数组那么方便使用了,如果要改,改动的地方不少,有些费事儿,想了想,还是使用动态变量的办法来处理。

使用动态变量,其实是用read来赋值,用eval来取值,但是很久没看shell的东西了,有些手生,自己摸索了半天,终于还是弄出来了,故作个笔记,防止以后再遗忘。

假定我定义了如下的变量:

xl,yl,zl, xh,yh,zh

要对x,y,z作循环,对这些从文件赋值,就是:

j=0

for i in x y z

do

      j=$((j+1))

      sed –n ‘’”$j”’’p filename1>filename2

      read $(echo $i)l $(echo $i)h<filename2

done

如果对这些从字符串赋值,就是:

j=0

for i in x y z

do

      j=$((j+1))

      read $(echo $i)l $(echo $i)h<<<`sed –n ‘’”$j”’’p filename1`

done

在循环中取出两组已赋值的变量,并求和:

t1=`eval echo '$'"$(echo $i)l"`

t2=`eval echo '$'"$(echo $i)h"`

read $(echo $i)h<<<`echo "$t1 + $t2"|bc`

t2=`eval echo '$'"$(echo $i)h"`

sed输出由动态变量[x]linen保存的数字作行号的行:

sed -n ''"$(($(echo $i)linen))"''p filename

sed替换动态变量名所在行内容为动态变量内容和动态变量名:

A="$t1 $(echo $i)l"

sed -i '/'"$(echo $i)l"'/s/.*/'"$A"'/g' filename