【发布时间】:2012-06-19 20:59:41
【问题描述】:
我在 bash 中有一个小脚本,它通过 gnuplot 生成图表。 一切正常,直到输入文件的名称包含空格。
这是我得到的:
INPUTFILES=("data1.txt" "data2 with spaces.txt" "data3.txt")
...
#MAXROWS is set earlier, not relevant.
for LINE in $( seq 0 $(( MAXROWS - 1 )) );do
gnuplot << EOF
reset
set terminal png
set output "out/graf_${LINE}.png"
filenames="${INPUTFILES[@]}"
set multiplot
plot for [file in filenames] file every ::0::${LINE} using 1:2 with line title "graf_${LINE}"
unset multiplot
EOF
done
此代码有效,但输入文件名中没有空格。
在 gnuplot 示例中对此进行评估:
1 iteration: file=data1.txt - CORRECT
2 iteration: file=data2 - INCORRECT
3 iteration: file=with - INCORRECT
4 iteration: file=spaces.txt - INCORRECT
【问题讨论】:
-
不要使用
seq。for ((line=0; line < maxrows; line++)); do。不要使用全部大写的变量名。认为您对问题的措辞不正确,除非由于某种原因,当文件名 NOT 包含空格时,事情确实会中断。在heredoc 中没有引号删除。 "${INPUTFILES[@]}" 扩展为用双引号括起来的以空格分隔的元素列表。如果这在 gnuplot 中适用于指定文件列表,则您必须弄清楚如何转义空格。 -
@ormaaj 已解决问题。我想到了一些来自 gnuplot .. 的系统调用,比如 sed 将空格切换为破折号,然后再返回。为什么不使用 seq(可读性?!)和全大写变量名?