bash:执行字符串作为命令

时间:2015-06-16 14:26:53

标签: string bash gnuplot command-line-arguments

请参阅我之前关于汇总特定字符串here的问题。

我得到了这个问题的答案,但不幸的是,这些信息实际上并没有帮助我完成我想要实现的目标。

使用该帖子中的信息,我已经能够汇编以下字符串集:gnuplot -e "filename='output_N.csv'" 'plot.p'其中N被整数的字符串表示替换。

在下面的循环将解释:(其实,有可能做这个循环,你可能想指出一个更好的办法 - 希望下面的代码不会打乱的人太多了......)

  1 #!/bin/bash
  2 n=0
  3 for f in output_*.csv
  4 do
  5     FILE="\"filename='output_"$n".csv'\""
  6     SCRIPT="'plot.p'"
  7     COMMAND="gnuplot -e $FILE $SCRIPT"
  8     $COMMAND
  9     n=$(($n+1))
 10 done

不幸的是,这不起作用... gnuplot确实运行,但是给出了以下错误消息:

"filename='output_0.csv'"
^
line 0: invalid command


"filename='output_1.csv'"
^
line 0: invalid command


"filename='output_2.csv'"
^
line 0: invalid command


"filename='output_3.csv'"
^
line 0: invalid command

...

所以,正如我之前所说,我不是bash的专家。我的猜测是某些东西没有被正确解释 - 要么被解释为不应该被解释为的字符串,要么它被解释为不应该被解释为字符串? (只是一个猜测?)

如何解决此问题?

我的gnuplot脚本的前几行(相关)如下:

(注意使用作为命令行参数输入的变量filename。请参阅此link。)

30 fit f(x) filename using 1:4:9 via b,c,e
31 
32 plot filename every N_STEPS using 1:4:9 with yerrorbars title "RK45 Data", f(x) title "Landau Model"

1 个答案:

答案 0 :(得分:-2)

轻松修复 - 我用引号搞错了。 (""

基本上,文本"周围需要引号"filename='output_"$n".csv'的唯一原因是,在执行命令之前,bash会正确解释此字符串!因此,当命令gnuplot -e "filename='output_0.csv'" 'plot.p'直接输入终端时程序运行是正确的,但在预先组装字符串时不需要引号。 (这有点难以解释,但希望在你的脑海中清楚地表明2之间的区别。)

因此上述代码的更正版本为:

  1 #!/bin/bash
  2 n=0
  3 for f in output_*.csv
  4 do
  5     FILE="filename='output_"$n".csv'"
  6     SCRIPT='plot.p'
  7     COMMAND="gnuplot -e $FILE $SCRIPT"
  8     $COMMAND
  9     n=$(($n+1))
 10 done

现在已经纠正并正常工作。请注意删除转义的双引号。