Answers:
您可以通过开关输入变量 -e
$ gnuplot -e "filename='foo.data'" foo.plg
然后在foo.plg中可以使用该变量
$ cat foo.plg
plot filename
pause -1
要使“ foo.plg”更加通用,请使用条件:
if (!exists("filename")) filename='default.dat'
plot filename
pause -1
注意,-e
必须在文件名之前,否则文件在-e
语句之前运行。特别是,#!/usr/bin/env gnuplot
使用./foo.plg -e ...
CLI参数运行shebang gnuplot 将忽略使用提供的参数。
if (!exists("filename")
而不是if ! exists("filename")
。
-e
参数中指定每个,例如-e "filename='default.data'; foo='bar'"
或-e "filename='default.data'" -e "foo='bar"'
。
-e ...
选项必须在文件名之前。从man gnuplot
我们的确可以看到:-e
“命令列表” 在加载下一个输入文件之前执行请求的命令。。
从5.0版开始,您可以使用标记将参数传递给gnuplot脚本-c
。这些参数是通过变量访问ARG0
到ARG9
,ARG0
作为脚本,并ARG1
以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
请注意,脚本名称没有变量,$0
第一个参数也没有,变量在引号内调用。无法通过命令行直接使用此方法,只能使用@ con-fu-se建议的技巧。
-c
与包含线,如脚本开关plot 'data' using 0:($1/100)
。gnuplot
因错误无效表达式而死亡,因为$1
它消失了。我哪里错了?请注意,如果不使用-c
,脚本将成功运行。
gnuplot 5.0
通过在这些示例中添加一行来测试了它plot 'data' using 0:($1/100)
,但并没有得到您的认可。很少见,因为此版本定义了变量ARG0
- ARG9
,而不是$1
- $9
。我假设您也有版本5.0(是吗?),因为-c
早期版本不支持该标志。我需要看一个最小的脚本,看看真正的问题在哪里:/
gnuplot 5.0 patchlevel 0
在cygwin下运行。单行脚本print ARG1; plot 'data' using 0:($1/100)
正确打印了传递为的值ARG1
,然后退出,并带有错误无效表达式,其指向的斜线print ARG1; plot 'data' using 0:(/100)
。
您也可以按照此处的建议通过环境传递信息。Ismail Amin的示例在此处重复:
在外壳中:
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
name=plot_data_file ./the_gnuplot_script
。
name=value command
告诉Shell在其环境中使用该特定变量运行命令。我正在使用bash 4.3.11,但我相信这是一个非常常见的shell功能。
Jari Laamanen的答案是最好的解决方案。我只想解释一下如何在shell变量中使用多个输入参数:
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脚本中),但是需要使用''封装字符串变量(gnuplot语法,不是Bash语法)
'
还是"
使用字符串都没有关系。-e
参数周围的引号必须"
替换bash变量。以下内容也可以正常工作:OUTPUT=foobar; gnuplot -e "output=\"$OUTPUT\"; print output"
这个问题已经很好地回答了,但是我想我可以在这里找到合适的人选,即使只是为了像我一样减少使用谷歌搜索的人的工作量。vagoberto的回答为我提供了解决此问题版本所需的工具,因此在此我将分享我的解决方案。
我在最新的环境中开发了一个绘图脚本,从而可以执行以下操作:
#!/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 'output.png' 2.3 6.7 4.3 7
上传到我的服务器并执行后,由于服务器版本为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中的参数。
您甚至可以做一些魔术,例如:
#!/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调用时替换了一些魔术令牌……),但是我简化了此示例以更好地理解。您还可以使其更简单。
在shell中写
gnuplot -persist -e "plot filename1.dat,filename2.dat"
并依次选择所需的文件。-persist用于使gnuplot屏幕停留,只要用户不手动退出它即可。
gnuplot -persist -c "myscript.plt" "mydata.csv" "myoutput.png"
该命令可以正常运行,并且按我期望的方式获得文件“ myoutput.png”,但是没有出现gnuplot屏幕(exit
myscript.plt中为NO 命令)。为什么?以及如何在示例中显示gnuplot屏幕?
如果您需要位置参数,@ vagoberto的答案似乎是最好的恕我直言,我还有一点改进。
瓦戈贝托的建议:
#!/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
对于像我这样的懒惰打字员,可以使脚本可执行(chmod 755 script.gp
)
然后使用以下命令:
#!/usr/bin/env gnuplot -c
THIRD=ARG3
print "script name : ", ARG0
print "first argument : ", ARG1
print "third argument : ", THIRD
print "number of arguments: ", ARGC
并执行为:
$ ./imb.plot a b c d
script name : ./imb.plot
first argument : a
third argument : c
number of arguments: 4
if
提供默认值。if ! exists("filename") filename='default.data'