我正在制作这个 shell 脚本,以便用 gnuplot 更快地绘制数据。这是我写的第一个ss,所以我遇到了一些困难。一切都很好,直到我开始做出 if 语句。现在执行此命令会返回此错误:
prova2.sh: 53: prova2.sh: Syntax error: end of file unexpected (expecting "fi")
这是一个例子。我在这里做错了什么?
...
if ["$ANSWER" == "S"]
then
ANSWER= set grid
else
ANSWER=""
echo "you want the plot whit boxes with lines or with points?"
read HOW
if ["$HOW" == "boxes"]
then
P= boxes
else if ["$HOW" == "lines"]
then
P= lines
else if ["$HOW" == "points"]
then
P= points
gnuplot <<EOF
...
fi
答案1
这是脚本的 if/then/elif/fi 部分的更正版本:
if [ "$ANSWER" == "S" ]
then
ANSWER='set grid'
else
ANSWER=""
fi
echo "you want the plot with boxes, with lines, or with points?"
read HOW
if [ "$HOW" == "boxes" ]
then
P=boxes
elif [ "$HOW" == "lines" ]
then
P=lines
elif [ "$HOW" == "points" ]
then
P=points
fi
=
请注意,当设置ANSWER
and后缺少空格P
,并且使用elif
not else if
。我还在[
和 正在测试的变量之间添加了一个空格[boxes
or与or[S
不同。前者尝试运行例如命令,而后者则使用参数运行。[ boxes
[ S
[boxes
[
boxes
我还在 中添加了引号ANSWER='set grid'
,如果没有引号,它将设置ANSWER=set
,然后尝试运行名为 的命令grid
。从技术上讲,行上也应该有引号P=
,但后面只有一个单词(没有空格),=
则不需要它们。
就我个人而言,我会将s 与andthen
放在同一行,因为我认为这使其更具可读性,但这并不重要 - 这只是一种样式偏好,无论哪种方式,代码的工作方式都是相同的。if
elif
if [ "$HOW" == "boxes" ] ; then
P=boxes
elif [ "$HOW" == "lines" ] ; then
P=lines
elif [ "$HOW" == "points" ] ; then
P=points
fi
答案2
你必须结束每个 if
声明与fi
in sh.像这样:
#!/bin/sh
BANANA=1
if [ $BANANA -eq 1 ]; then
echo "Banana was 1"
else
echo "Oops"
fi
echo "This line will always be run"
也就是说,程序中fi
的每一个都需要一个if
,并且位置fi
决定了仅有时执行的代码的结束位置。