例如,如果我做了一个参数扩展:
$ b=1
$ echo $b
1
内部存储在哪里b
?我检查了一下,它不是一个环境变量,因为它没有被列出printenv
。我正在编写自己的 shell 来学习 Unix,我使用哈希表作为“符号查找表”来存储和检索变量 - 这种方法是一个好方法还是您会建议我其他方法?
答案1
当您登录以读取命令并运行它们时运行的 shell 会保留所有变量。如果您运行第二个 shell,那么它将有自己的变量集合。您可以运行该set
命令来查看变量列表。该set
命令在 shell 内部运行,而不是启动新进程。
环境变量要么保存在单独的空间中,要么进行标记(如果重要,请阅读 shell 源代码),以便它们沿着 shell 运行的程序传递。
使用两个哈希表对我来说似乎是合理的。
答案2
它只是程序执行期间的一个变量。思考这个问题的另一种方法是将您的程序重写为以下内容。
#!/bin/bash
b=1
echo $b
exit
现在,假设您正在终端中执行此操作,然后退出该终端会话。打开另一个终端会话不会显示任何事物关于b=1
上届会议的这项任务。
这称为“局部变量”,而不是“全局变量”。它们与许多其他功能一起使用 来显示set
。
因此,如果您想查看作业,请执行以下操作
set |grep '^b='
b=1
请参见Linux 文档项目了解更多信息。
答案3
Shell 变量存储在正在运行的 shell 的内存中。使用任何可以让您根据名称轻松查找项目的数据结构;哈希表是一个不错的选择。
shell变量和环境变量的区别在于环境变量放在子进程的环境中。所有环境变量都是 shell 变量。存储它们的自然方法是创建一个哈希表,该哈希表不将变量名称映射到值,而是映射到包含值和一些标志(导出、只读等)的结构。