为什么之后不接受分号?

为什么之后不接受分号?

我是 shell 编程的新手,注意到以下内容被接受:

if [ $table = "Session" ]; then
continue; fi

以下内容也是如此:

if [ $table = "Session" ]; then continue; fi

虽然以下会产生语法错误:

if [ $table = "Session" ]; then; continue; fi

为什么then关键字与其他关键字不同?

答案1

因为then它既不是命令也不是 shell 内置的,但实际上是if语法的一部分。从man bash

   if list; then list; [ elif list; then list; ] ... [ else list; ] fi
          The  if  list is executed.  If its exit status is zero, the then
          list is executed.  Otherwise, each  elif  list  is  executed  in
          turn,  and  if  its  exit status is zero, the corresponding then
          list is executed and the command completes.  Otherwise, the else
          list  is executed, if present.  The exit status is the exit sta‐
          tus of the last command executed, or zero if no condition tested
          true.

所以这:

if [ $table = "Session" ]; then continue; fi

之所以有效,是因为 和[ $table = "Session" ]都是continue可以独立运行的命令;它们组成了命令list的相应部分if。只需将它们粘贴到交互式 shell 中,您就会发现它们不会导致任何语法错误:

martin@martin:~$ export table=test
martin@martin:~$ [ $table = "Session" ]
martin@martin:~$ continue
bash: continue: only meaningful in a `for', `while', or `until' loop

另一方面,then它并不是一个可以独立存在的真正命令:

martin@martin:~$ then
bash: syntax error near unexpected token `then'

因此,在前两个示例中,您所使用的if就像手册页所描述的那样:

if list; then list; fi

但如果你在;后面加上一个thenbash则会将其视为语法错误。不可否认,shell 语法有时看起来相当令人困惑,尤其是当您刚刚接触它时。我记得我对它需要[和周围的空格这一事实感到非常困惑],但是一旦您意识到这[实际上是一个命令或 shell 内置命令,它就可以理解了。 :)

答案2

您需要在命令后添加分号。[ … ]是一个命令,就像 一样continue。另一方面,ifthenfi不是命令:它们是保留字。

if看起来像一个命令,但那是因为它后面几乎总是紧跟着一个命令。写是有效的

if print_table_value >foo; [ "$(cat foo)" = "Session" ]; then …

也可以通过多种方式呈现,例如

if
  print_table_value >foo
  [ "$(cat foo)" = "Session" ]
then

条件命令的一般语法是

如果复合列表然后复合列表
(埃利夫复合列表然后复合列表* 
(别的复合列表然后复合列表

在哪里

  • 换行符只是为了便于阅读。
  • A复合列表是一个命令列表,每个命令都以换行符;或换行符结尾。
  • (……)表示可选部分,(…) *表示可以重复 0、1 次或多次的部分。

关键字仅在命令开头才会被识别。

条件命令必须以关键字 结尾fi。如果后面出现其他命令,这并不能消除操作员跟随它的需要;例如,如果条件语句后面要跟另一个命令,那么;中间需要有一个 或 换行符;如果条件要在后台执行,那么后面需要跟 等等&

相关内容