问题:
今天在通过shell脚本用gnuplot批量画图时遇到一个问题,即各个数据文件名称不同,用“ plot 'datafile_suffix.dat' ”命令时无法正确读取到各个文件,好在文件名有相同的前缀datafile,后缀也是有规律的,可以用for循环匹配变量名,但是有点麻烦,我就用了另一个办法。
解决:
用“find”查找数据文件,然后把查找结果传递给变量,进而通过读取变量名画图。文字描述有点饶人,命令其实很简单(比如数据文件名为datafile_suffix.dat):
filename=`find $dir/datafile_*`
echo "
plot '$filename'
" | gnuplot
上述代码中等号前后不能有空格,且等号后的“** **”是键盘上方的数字键 1 左边那个按键,而不是单引号,其作用为“**
”之内的命令将被先执行(此处即为“ find $dir/datafile_ ”),其中的“ $dir ”为数据文件所在文件夹的名称。另外,echo** 后面必须用双引号而不是单引号,否则plot 命令后跟的变量$filename将不能正确取用。
注: 此备注只是简单的方法思路,实际程序还要用for循环遍历所有存放数据的文件夹。
补:有个问题不明白
~ # a=Documents/
~ # echo $a
Documents/
即将一个路径名称赋值给变量,显示正常,但是:
~ # i=1
~ # a$i=Documents/
bash: a1=Documents/: No such file or directory
即变量名中有变量代换时无法正确赋值。好像是执行$i代换就相当于执行了一步命令,所以** a$i=Documents/ 就等价于对一个名为 a1=Documents/ 的文件或文件夹操作,但并没有这个文件或文件夹,于是发生错误,此处的” = **“的变量赋值功能消失了,变成了字符串的一部分。
不知道该如何解决,目的是批量定义变量,且变量内容为路径名称,如下(错误代码):
for i in {1..10}; do var$i=~Documents/data$i;done