Bash 脚本变量放置

bla*_*ace 8 bash

我开始学习 Bash 脚本,我正在使用Bash 脚本教程

那里说

在 Bash 解释(或运行)我们脚本的每一行之前,它首先检查是否存在任何变量名。对于它识别的每个变量,它用它的值替换变量名。然后它运行该行代码并在下一行再次开始该过程。

那么 Bash 是否首先运行整个脚本来查找变量?我不确定这是否是作者试图说的,但如果是的话,我想这是不正确的?

当我执行:

#!/bin/bash


echo "hello $USERR"



USERR=John
Run Code Online (Sandbox Code Playgroud)

我得到hello了结果。

如果我运行:

#!/bin/bash


USERR=John

echo "hello $USERR"
Run Code Online (Sandbox Code Playgroud)

然后我得到hello John了结果。

mau*_*wns 11

那么 Bash 是否首先运行整个脚本来查找变量?

不。正如您在示例中发现的那样,Bash 脚本是从上到下执行的。

一个好的做法是在脚本顶部定义您需要的所有变量。


Kus*_*nda 9

这是一种非常草率的说法,即 shell 会扫描每个命令以进行扩展,例如变量(还有命令替换等)

可以将文本解释为暗示 shell 读取整个脚本并在执行前查找每一行的变量。事实并非如此。它按命令处理脚本命令,而不是逐行处理。一个命令可以跨越多行。直到 shell 解释器在执行脚本时得到它,才会处理命令。

bash在执行每个命令之前,shell 会对它执行以下操作:

  1. 大括号扩展
  2. 波浪号扩展
  3. 参数和变量扩展
  4. 算术展开
  5. 命令替换(以从左到右的方式完成)
  6. 分词
  7. 路径扩展
  8. 报价删除

  • @blablatrace 我推荐 https://unix.stackexchange.com 作为学习如何在 shell 中使用和编程的好资源,尽管质量有时会有所不同。社区也普遍友好。也请查看 [聊天](https://chat.stackexchange.com/rooms/26/dev-chat)(虽然有时有点空)。 (3认同)
  • 其他优秀的 bash 脚本资源:[Greg 的 wiki](http://mywiki.wooledge.org) 和 [BashFAQ](http://mywiki.wooledge.org/BashFAQ),[Bash Hacker's Wiki](http:// wiki.bash-hackers.org) 和 [shellcheck.net](https://www.shellcheck.net) 检查您的脚本是否存在常见问题。 (2认同)