bash:将字符串作为命令执行

bash: Execute a string as a command

请参阅我之前关于组装特定字符串的问题

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

使用 post 中的信息,我已经能够 assemble 以下一组字符串: 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"

轻松修复 - 我的引号有误。 ("")

本质上,文本 filename='output_"$n".csv' 周围需要引号 "" 的唯一原因是 bash 可以正确解释此字符串,在执行命令之前!所以直接在终端输入命令 gnuplot -e "filename='output_0.csv'" 'plot.p' 程序运行确实是正确的,但是事先组装字符串时不需要引号。 (这有点难以解释,但希望您清楚两者之间的区别。)

所以上面代码的更正版本是:

  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

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