0

set for cycleコマンドを使用して gnuplot 環境の変数を設定しようとしています。私は 4.6 バージョンを使用しており、gnuplot のドキュメント (70 ページ)によると、構文は次のとおりです。

for [intvar = start:end{:increment}]
for [stringvar in "A B C D"]
Examples:
set for [i = 1:10] style line i lc rgb "blue"

しかし、私はこのエラーが発生します:

gnuplot> set for [var in gpvars] replace(var,'#_#',' ')
                                 ^
         line 0: Unrecognized option.  See 'help set'.

私のスクリプト:

#!/bin/bash

OUTDIRNAME="out"
TIMEFORMAT='%d.%m.%y'
GPPARS=( "xlabel "Time"" "ylabel "value1"" "y2label "value2"" "format x "%H:%M"")
GPPARS_MOD=()

for (( i=0; i < ${#GPPARS[@]}; i++)); do 
  FILE=${GPPARS[${i}]}
  echo "arg=${FILE}"
  GPPARS_MOD+=( "`echo "${FILE}" | sed -e 's/ /#_#/g'`" )
done

gnuplot << EOF
reset

replace(S,C,R)=(strstrt(S,C)) ? \
    replace( S[:strstrt(S,C)-1].R.S[strstrt(S,C)+strlen(C):] ,C,R) : S

set terminal png
set output "${OUTDIRNAME}/graph.png"
set timefmt "${TIMEFORMAT}"
set xdata time

gpvars="${GPPARS_MOD[@]}"

set for [var in gpvars] {
   replace(var,'#_#',' ')
}

...

EOF

...

exit 0 

スペース (gnuplot はエスケープ シーケンスを無視する) のため、関数置換も使用しています。この関数は、サイクルのプロットに対して問題なく動作します。関数の有無にかかわらず、スペースのない変数を使用してみましたが、結果は同じです。

4

1 に答える 1

1

補足として-あなたのbash配列があなたが望むように物事をグループ化すると信じているかどうかはわかりません...私にとって、あなたの引用は取り除かれます。試す:

GPPARS=( "xlabel 'Time'" "ylabel 'value1'" "y2label 'value2'" "format x '%H:%M'")

代わりは。(内部の二重引用符は一重引用符に置き換えられます)

これは難しい問題です -- gnuplot 4.6 を使っているのは良いことです。 (編集 - gnuplot 4.4 を使用すると、、、、、、およびマクロの組み合わせ使用できますが、これは非常に厄介な解決策です)wordwordsifrereadexists

次のようなものであるため、あなたが持っているものは機能しないことに注意してください。

MYLABEL='xlabel "foo"'
set MYLABEL

gnuplot は set コマンドを実行する前に MYLABEL を展開しないので、次のようなことができます:

MYLABEL="totally cool X label here!"
set xlabel MYLABEL

あなたが望むことは、マクロを使用して達成することができます(しかし、悲しいかな、反復ではありません):

set macro 
MYLABEL='xlabel "foo"'
set @MYLABEL

しかし、マクロ展開が他の何よりも先に行われるため (関数評価など)、ここでもうまくいきません。ここで必要なのは、4.6 で導入された gnuplot のより一般的なイテレーションと、eval

do for [ var in gpvars ] {
    eval( 'set '.replace(var,'#_#',' ') )
}

編集 -- gnuplot 4.2+ ソリューション

#top of script -- Nothing should go here.
replace(S,C,R)=(strstrt(S,C)) ? \
     replace( S[:strstrt(S,C)-1].R.S[strstrt(S,C)+strlen(C):] ,C,R) : S
if( ! exists("N") ) N=1
TODO="${GPPARS_MOD[@]}"
set macro
do_set=replace(word(TODO,N),'#_#',' ')
set @do_set
N=N+1
if( N <= words(TODO) ) reread
#rest of script here ...
于 2012-06-21T13:33:36.657 に答える