답변:
스위치를 통해 변수를 입력 할 수 있습니다 -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
문. 특히 CLI 인수 #!/usr/bin/env gnuplot
와 함께 shebang gnuplot 을 실행하면 ./foo.plg -e ...
제공된 인수 사용이 무시됩니다.
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
. -c
플래그가 이전 버전에서 지원되지 않기 때문에 버전 5.0도 사용한다고 가정합니다 . 진짜 문제입니다 내가 볼 수있는 최소한의 스크립트를 참조해야합니다 : /
여기 에 제안 된대로 환경을 통해 정보를 전달할 수도 있습니다 . 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
이 환경에서 특정 변수로 명령을 실행하도록 지시합니다. bash 4.3.11을 사용하고 있지만 매우 일반적인 쉘 기능이라고 생각합니다.
Jari Laamanen의 답변이 최고의 솔루션입니다. 쉘 변수와 함께 둘 이상의 입력 매개 변수를 사용하는 방법을 설명하고 싶습니다.
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 스크립트와 같이) 문자열 변수 NEED는 ''(gnuplot 구문, NOT 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
이 두 스크립트를 조합하면 gnuplot 버전 및 기본적으로 * nix와 상관없이 bash에서 gnuplot 스크립트로 매개 변수를 전달할 수 있습니다.
다음과 같은 쉘 마법을 수행 할 수도 있습니다.
#!/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 호출에서 일부 마법 토큰을 교체하는 중입니다 ...) 이미 이해하기 쉽도록이 예제를 단순화했습니다. 당신은 또한 더 간단하게 만들 수 있습니다 .... YMMV.
쉘 쓰기
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의 답변이 가장 좋은 IMHO로 보이며 추가 할 약간의 개선 사항이 있습니다.
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'