`if` 和 `then` 实际上是程序

Max*_*kyi 15 shell bash shell-script

我读过分号用于分隔程序:

$ echo 3; ls -la
Run Code Online (Sandbox Code Playgroud)

这是否意味着if,then和else是单独的程序?

$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
Run Code Online (Sandbox Code Playgroud)

这个问题与分号无关。

Kus*_*nda 27

在;中隔离报表(严格意义上)。(几乎)总是可以用;换行符替换 a 。

说这;将两个程序分开,因此if并且then必须是“程序”有点过于简单了,因为语句可能由保留字、shell 函数、内置实用程序和外部实用程序以及这些使用管道和布尔运算符等的组合组成。 等等。

双方if并then保留在字壳语法,而不是“程序”。在这里,它们用于构建技术上称为复合命令的内容。

echo可能是外壳程序中的内置实用程序(但不一定是),并且ls可能是外部实用程序(或您所说的“程序”)。


Jde*_*eBP 7

虽然当人们开始学习使用 shell 的基础知识时,这是一个公平的第一个近似值,但在“这是一个人如何运行程序”和“这是一个人如何在一行上一个接一个地运行多个程序”的级别上,事实并非如此。

初学者更难掌握但更正确的解释是shell语言是一种计算机语言。它有一个语法。该语法包含各种词汇元素,包括(除其他外)换行符、运算符、单词和保留字。

if、then、else和fi都是保留字。根据其语法,在解析提供给 shell 的输入时,它们具有特定的含义。类似地,是一个分隔符操作符。;

因此,shell 语言中的输入作为一个整体,是一个由另一个程序、解释器、shell解释的计算机程序。它的个别语法部分不是程序。shell 语言是一种为 shell 指定(其他)程序以运行的方式。

[不是 shell 语法中的特殊词法元素,例如运算符。这是一个普通的词,命名一个这样的程序名为[. 许多 shell 都有这个程序的内置版本,并结合到 shell 程序本身的代码中,但是您也可以在某个地方找到一个同名的外部程序,例如/bin/[或/usr/bin/[,shell以外的程序可以调用该程序。同样,]也不是一个特殊的 shell 词法元素。这是一个普通的词,成为[程序的参数。该[程序要求其最终参数在执行时为],然后忽略该参数。

您的问题中命名的另一个类似程序是echo. 同样,大多数 shell 都有这个程序的内置版本。但同样还有一个程序的外部版本,例如/bin/echo或/usr/bin/echo,用于调用 shell以外的程序。

您的问题中命名的第三个程序是ls. Shell 通常没有这个程序的内置版本,它是一个外部程序,可以在诸如/bin/ls或 之类的地方找到/usr/bin/ls。

对于 Bourne Again shell,您可以在 GNU Bourne Again shell 信息文档的Basic Shell Features中阅读更多相关信息。其他 shell 自然有不同的语法。该单一Unix规格描述语法,所有POSIX符合的炮弹(在他们的POSIX符合的模式)都应该坚持。

进一步阅读

  • “贝壳语法”。 外壳命令语言。基本规范问题 7。开放组。IEEE 1003.1-2008。ISBN 1937218812。
  • test. 公用事业。基本规范问题 7。开放组。IEEE 1003.1-2008。ISBN 1937218812。
  • “贝壳语法”。 Z 壳牌手册。版本 5.3.1。2017 年。


Joh*_*éen 5

将if,then和else视为外部程序实际上并不牵强。事实上,原始 1 版 Unix 中的 Thompson shell 已实现if并goto作为外部程序。这是可能的,因为子进程与 shell 进程共享文件描述符,因此(向前)goto 只需读取输入,直到找到目标标签然后退出。请参阅汤普森壳。

  • _“将 if、then 和 else 视为外部程序实际上并不牵强”_ 嗯,确实如此,因为它们不是。 (2认同)