今天在用shell腳本進(jìn)行批量畫圖時(shí)遇到一個(gè)關(guān)于“$”符號(hào)的小問(wèn)題,后來(lái)解決了,在此備忘。
問(wèn)題
畫圖命令中要對(duì)數(shù)據(jù)進(jìn)行運(yùn)算,這時(shí)就要用到$1,$2表示數(shù)據(jù)文件的第一和第二列,我第一次代碼如下所示:
#!/bin/bash
echo "
set term png size 1280, 720
set output './ef.png'
set style data linespoints
set key top right
set xlabel 'x'
set ylabel 'y'
plot 'data.dat' u 1:($1-log($2))
' | gnuplot
exit 0
在運(yùn)行時(shí)就會(huì)提示表達(dá)式不對(duì),后來(lái)才發(fā)現(xiàn)腳本中的“$”有問(wèn)題:在gnuplot中它應(yīng)該表示某一列數(shù)據(jù),但是在shell腳本中(如echo "$var"這樣的命令中)表示取用變量,明顯在上述腳本中"$"優(yōu)先表示shell命令中的取用變量功能,而不是gnuplot中取用某列數(shù)據(jù)的功能,所以發(fā)生了錯(cuò)誤。
解決方法
思路:
在shell中echo 有兩種用法:
1. echo "the var is $var"
2. echo 'the var is $var'
以上兩種做法的差別僅在于使用雙引號(hào)還是單引號(hào),第一種做法中的雙引號(hào)能保有變量var的內(nèi)容,如var=5,第一種用法顯示的結(jié)果就是:
the var is 5
而第二種用法中的單引號(hào)內(nèi)僅是一般字符,不會(huì)對(duì)"$" 進(jìn)行解釋,則第二種用法的顯示結(jié)果為:
the var is $var
解決方法:
依照以上思路,只需將腳本中echo命令后面的雙引號(hào)換成單引號(hào),畫圖命令中的“$”就能正確的表達(dá),為了避免混淆,腳本中其他各處原來(lái)的單引號(hào)均換成雙引號(hào),改后的程序如下:
#!/bin/bash
echo '
set term png size 1280, 720
set output "./ef.png"
set style data linespoints
set key top right
set xlabel "x"
set ylabel "y"
plot "data.dat" u 1:($1-log($2))
' | gnuplot
exit 0
結(jié)束。