如何将命令行parameter passing给gnuplot?

我想用gnuplot从数据文件中绘制graphics,比如foo.data 。 目前,我在命令文件中对数据文件名称进行了硬编码,比如说foo.plt ,然后运行命令gnuplot foo.plg来绘制数据。 但是,我想传递数据文件名作为命令参数,例如运行命令gnuplot foo.plg foo.data 。 如何parsinggnuplot脚本文件中的命令行参数? 谢谢。

您可以通过开关-einputvariables

 $ gnuplot -e "filename='foo.data'" foo.plg 

在foo.plg中,您可以使用该variables

 $ cat foo.plg plot filename pause -1 

为了使“foo.plg”更具通用性,请使用条件:

 if (!exists("filename")) filename='default.dat' plot filename pause -1 

您可以使用标志-c从5.0版本开始将parameter passing给gnuplot脚本。 这些参数是通过variablesARG0ARG9ARG0是脚本和ARG1ARG9stringvariables来ARG9 。 参数的数量由ARGC给出。

例如,以下脚本(“script.gp”)

 #!/usr/local/bin/gnuplot --persist THIRD=ARG3 print "script name : ", ARG0 print "first argument : ", ARG1 print "third argument : ", THIRD print "number of arguments: ", ARGC 

可以被称为:

 $ gnuplot -c script.gp one two three four five script name : script.gp first argument : one third argument : three number of arguments: 5 

或者在gnuplot内

 gnuplot> call 'script.gp' one two three four five script name : script.gp first argument : one third argument : three number of arguments: 5 

在gnuplot 4.6.6和更早的版本中,存在一个具有不同(现在不推荐)的语法的call机制。 参数通过$#$0 ,…, $9 。 例如,上面的脚本看起来像:

 #!/usr/bin/gnuplot --persist THIRD="$2" print "first argument : ", "$0" print "second argument : ", "$1" print "third argument : ", THIRD print "number of arguments: ", "$#" 

它被称为gnuplot内(记住,版本<4.6.6)

 gnuplot> call 'script4.gp' one two three four five first argument : one second argument : two third argument : three number of arguments: 5 

注意脚本名没有variables,所以$0是第一个参数,variables在引号内被调用。 没有办法直接从命令行使用它,只能通过@ con-fu-sebuild议的技巧来使用它。

您也可以像这里所build议的那样通过环境传递信息。 Ismail Amin的例子在这里重复:

在shell中:

 export name=plot_data_file 

在Gnuplot脚本中:

 #! /usr/bin/gnuplot name=system("echo $name") set title name plot name using ($16 * 8):20 with linespoints notitle pause -1 

Jari Laamanen的答案是最好的解决scheme。 我只想解释如何在shellvariables中使用多个input参数:

 output=test1.png data=foo.data gnuplot -e "datafile='${data}'; outputname='${output}'" foo.plg 

和foo.plg:

 set terminal png set outputname f(x) = sin(x) plot datafile 

正如你所看到的,更多的参数是用分号(如bash脚本)传递的,但是stringvariables需要用''(gnuplot语法,NOT Bash语法)

您可以在unix / linux环境下使用技巧:

  1. 在gnuplot程序中:绘制“/ dev / stdin”…

  2. 在命令行中:gnuplot program.plot <data.dat

你甚至可以做一些shell魔法,比如:

 #!/bin/bash inputfile="${1}" #you could even do some getopt magic here... ################################################################################ ## generate a gnuplotscript, strip off bash header gnuplotscript=$(mktemp /tmp/gnuplot_cmd_$(basename "${0}").XXXXXX.gnuplot) firstline=$(grep -m 1 -n "^#!/usr/bin/gnuplot" "${0}") firstline=${firstline%%:*} #remove everything after the colon sed -e "1,${firstline}d" < "${0}" > "${gnuplotscript}" ################################################################################ ## run gnuplot /usr/bin/gnuplot -e "inputfile=\"${inputfile}\"" "${gnuplotscript}" status=$? if [[ ${status} -ne 0 ]] ; then echo "ERROR: gnuplot returned with exit status $?" fi ################################################################################ ## cleanup and exit rm -f "${gnuplotscript}" exit ${status} #!/usr/bin/gnuplot plot inputfile using 1:4 with linespoints #... or whatever you want 

我的实现有点复杂(例如,在sed调用中replace了一些魔法令牌,而我已经在…),但为了更好的理解,我简化了这个例子。 你也可以使它更简单…. YMMV。

这个问题已经得到了很好的回答,但是我想我可以find一个适当的位置来填补这个空白,如果只是为了减less像我这样使用Google的人的工作量。 从vagoberto的答案给了我需要解决我的这个问题的版本,所以我会在这里分享我的解决scheme。

我在一个最新的环境中开发了一个剧本脚本,允许我这样做:

 #!/usr/bin/gnuplot -c set terminal png truecolor transparent crop set output ARG1 set size 1, 0.2 rrLower = ARG2 rrUpper = ARG3 rrSD = ARG4 resultx = ARG5+0 # Type coercion required for data series resulty = 0.02 # fixed # etc. 

这个在最近使用gnuplot的环境(命令行5.0.3)中执行的效果非常好。

 $ ./plotStuff.gp 

当上传到我的服务器并执行,它失败了,因为服务器版本是4.6.4(目前在Ubuntu 14.04 LTS)。 下面的垫片解决了这个问题,而不需要改变原来的脚本。

 #!/bin/bash # GPlot v<4.6.6 doesn't support direct command line arguments. #This script backfills the functionality transparently. SCRIPT="plotStuff.gp" ARG1=$1 ARG2=$2 ARG3=$3 ARG4=$4 ARG5=$5 ARG6=$6 gnuplot -e "ARG1='${ARG1}'; ARG2='${ARG2}'; ARG3='${ARG3}'; ARG4='${ARG4}'; ARG5='${ARG5}'; ARG6='${ARG6}'" $SCRIPT 

这两个脚本的组合允许将参数从bash传递到gnuplot脚本,而不考虑gnuplot版本和基本上任何* nix。

还有一种方法是:

你有一个名为scriptname.gp的gnuplot脚本:

 #!/usr/bin/gnuplot -p # This code is in the file 'scriptname.gp' EPATH = $0 FILENAME = $1 plot FILENAME 

现在你可以通过这个令人费解的语法和平来调用gnuplot脚本scriptname.gp

 echo "call \"scriptname.gp\" \"'.'\" \"'data.dat'\"" | gnuplot 

在shell中写

 gnuplot -persist -e "plot filename1.dat,filename2.dat" 

并连续你想要的文件。 -persist用于使gnuplot屏幕保持不变,只要用户不手动退出即可。