在shell中,声明、定义和设置变量之间有什么区别?
“声明”是否意味着变量的标识符存在,但变量的存储和值不存在?
“已定义”是否意味着变量的标识符和存储都存在?
“set”是否意味着变量的值存在? (我在 Bash 手册中的 shell 变量部分读到了一些相关内容)
“定义”和“设置”是否彼此暗示,因此它们是相同的?
在 Bash 手册中,参数扩展部分提到了
${parameter:-word}
当parameter
未设置或为空时执行某些操作。“null”是否意味着“声明”但不是“定义”,或者“声明”但不是“设置”?
“未设置”是否意味着未“声明”?
提到的概念是否也适用于函数名称,并且与参数/变量的含义相同吗?
我还错过了哪些其他类似的概念?
笔记:
我分别对 POSIX shell 和 Bash 的答案感兴趣。
请注意,“变量的值存在”是指该变量已被赋值。通过“变量的存储存在”,我的意思是该变量已在内存中分配存储。
我的问题来自阅读https://unix.stackexchange.com/a/56846/674以及 Bash 手册中的相关部分。
答案1
- “声明”意味着您已经使用
declare
或typeset
指定了变量的类型。这允许您指定变量名称为数组,应始终被视为整数,应为只读等。这在 POSIX shell 中不存在,它是一个bash
扩展。 - 我认为“定义”和“设置”的意思是相同的:已经为变量赋予了一个值。你所提到的问题与他的措辞根本不一致。 POSIX shell 规范和
bash
手册在引用变量时不使用“定义”一词,它只是说:如果参数具有指定值(null 是有效值),则该参数被设置。
- “声明”意味着您已经使用
- “unset”与“set”相反——变量从未被赋值(或者您已经用来
unset
删除赋值)。如果使用该set
命令,则不会列出该变量。 - “null”表示变量已被分配一个 null(零长度)字符串作为值。
- “unset”与“set”相反——变量从未被赋值(或者您已经用来
我认为这些术语与功能无关。不存在空函数这样的东西(定义函数时不允许将函数体留空)。
${varname:-default}
如果函数未定义,则没有什么类似于需要执行任何特殊操作的函数。因此,要么定义了函数名称,就可以调用它,要么没有定义函数名称,如果尝试调用它,就会收到错误。
由于 shell 变量包含任意长度的字符串,因此在声明变量时不会分配存储空间。分配变量时动态分配存储空间。