【问题标题】:bash: Execute a string as a commandbash:将字符串作为命令执行
【发布时间】:2026-02-22 03:15:01
【问题描述】:

请参阅我之前关于组装特定字符串 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"

【问题讨论】:

    标签: string bash gnuplot command-line-arguments


    【解决方案1】:

    很容易解决 - 我用引号弄错了。 ("")

    本质上,在文本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
    

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

    【讨论】:

    • 您是否尝试过删除变量 FILE 中的转义双引号和单引号??