54

declare在 Bash 中输入变量时,和有什么区别typesetdeclare在函数内部使用时: andtypeset和 和有什么区别local

我遇到的唯一区别是 typeset 可以移植到 ksh 脚本。除此之外,还有什么理由为什么应该优先于另一个?

更新:添加local到问题中。

4

3 回答 3

34
  • typeset和之间的区别declare

前者更便携(例如 ksh),而后者在便携性不是问题时更可取。

  • declare(或typeset)与在函数内部使用时的区别local

前者暗示后者,但更强大。例如,declare -i x使xinteger属性,declare -r x使x只读等。

于 2012-04-18T03:52:26.620 回答
13

就 bash 而言,不,没有区别。事实上,手册页让它们共享相同的定义

声明 [-aAfFilrtux] [-p] [name[=value] ...]
排版 [-aAfFilrtux] [-p] [name[=value] ...]
声明变量和/或赋予它们属性。如果没有给出名称,则显示变量的值。-p 选项将显示每个名称的属性和值...

我还发现了这个小消息,它进一步证实了我的主张以及ksh您提到的可移植性。

内置的 declare 或 typeset 是精确的同义词,允许修改变量的属性。这是某些编程语言中可用的类型 [1] 的一种非常弱的形式。声明命令特定于 Bash 版本 2 或更高版本。typeset 命令也适用于 ksh 脚本。

于 2010-12-12T00:04:49.107 回答
7

4.2 Bash Builtin Commands部分下的 Bash 手册中,它指出:

'typeset'
typeset [-afFrxi] [-p] [NAME[=VALUE] ...]
提供'typeset' 命令是为了与 Korn shell 兼容;但是,它已被弃用,取而代之的是 'declare' 内置命令。

于 2010-12-12T02:52:05.167 回答