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
现在已更正并正常工作。请注意删除转义双引号。
请参阅我之前关于组装特定字符串的问题
我得到了那个问题的答案,但不幸的是,这些信息实际上并没有帮助我实现我想要实现的目标。
使用 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
现在已更正并正常工作。请注意删除转义双引号。