今天在用shell脚本进行批量画图时遇到一个关于“$”符号的小问题,后来解决了,在此备忘。
问题
画图命令中要对数据进行运算,这时就要用到$1,$2表示数据文件的第一和第二列,我第一次代码如下所示:
#!/bin/bash
echo "
set term png size 1280, 720
set output './ef.png'
set style data linespoints
set key top right
set xlabel 'x'
set ylabel 'y'
plot 'data.dat' u 1:($1-log($2))
' | gnuplot
exit 0
在运行时就会提示表达式不对,后来才发现脚本中的“$”有问题:在gnuplot中它应该表示某一列数据,但是在shell脚本中(如echo "$var"
这样的命令中)表示取用变量,明显在上述脚本中"$"优先表示shell命令中的取用变量功能,而不是gnuplot中取用某列数据的功能,所以发生了错误。
解决方法
思路:
在shell中echo
有两种用法:
1. echo "the var is $var"
2. echo 'the var is $var'
以上两种做法的差别仅在于使用双引号还是单引号,第一种做法中的双引号能保有变量var
的内容,如var=5
,第一种用法显示的结果就是:
the var is 5
而第二种用法中的单引号内仅是一般字符,不会对"$" 进行解释,则第二种用法的显示结果为:
the var is $var
解决方法:
依照以上思路,只需将脚本中echo
命令后面的双引号换成单引号,画图命令中的“$”就能正确的表达,为了避免混淆,脚本中其他各处原来的单引号均换成双引号,改后的程序如下:
#!/bin/bash
echo '
set term png size 1280, 720
set output "./ef.png"
set style data linespoints
set key top right
set xlabel "x"
set ylabel "y"
plot "data.dat" u 1:($1-log($2))
' | gnuplot
exit 0
结束。