【问题标题】:Differences between declare, typeset and local variable in BashBash中声明,排版和局部变量之间的区别
【发布时间】:2011-05-24 02:41:38
【问题描述】:

在 Bash 中键入变量时,declaretypeset 有什么区别?在函数内部使用时:declaretypesetlocal 有什么区别?

我遇到的唯一区别是排版可移植到 ksh 脚本。除此之外,还有什么理由可以说明为什么应该优先选择一个?

更新:在问题中添加了local

【问题讨论】:

  • 类似于this question
  • 是用typesetdeclarelocal声明的变量吗?如果不是,我们如何将它们本地化?

标签: bash shell variables scope declare


【解决方案1】:
  • typesetdeclare 之间的区别:

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

  • 在函数内部使用declare(或typeset)和local之间的区别:

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

【讨论】:

  • localdeclare 大部分是相同的,并且采用所有相同的参数,但有两个例外:如果不在函数中使用 local 将失败,并且没有 args 过滤器输出的 local 仅打印本地,声明没有。
  • @ormaaj 你是对的,我没有意识到local 也支持选项。非常感谢。
  • 所以用typesetdeclare 声明的变量是local?似乎这个问题是最明显的问题。
  • @AlexanderMills 在函数内使用declaretypeset 而不使用-g 修饰符将声明一个局部变量。 local 当然也会创建一个局部变量。在函数内声明变量的任何其他方法都将创建一个全局变量。
  • 我知道这是旧的,但需要注意的是,在一个函数中,declarelocal 是相同的(除了使用不带参数的local)。如果您使用local -g,该变量将违反直觉地成为全局变量!对我来说,唯一有用的区别是视觉上的,因此人类读者知道local 是本地的,而declare 是与-g 一起使用的。
【解决方案2】:

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

声明 [-aAfFilrtux] [-p] [名称[=值] ...]
排版 [-aAfFilrtux] [-p] [名称[=值] ...]
声明变量和/或 给他们属性。如果没有名字 给定然后显示的值 变量。 -p 选项将显示 每个人的属性和价值 名字...

我还发现 this little tidbit 进一步证实了我的主张以及您提到的 ksh 可移植性。

declare 或 typeset 内置函数, 它们是确切的同义词,允许修改变量的属性。 这是一种非常弱的打字形式 [1] 在某些编程中可用 语言。声明命令是 特定于版本 2 或更高版本 重击。排版命令也有效 在 ksh 脚本中。

【讨论】:

  • "help typeset" 告诉我它已经过时了。已弃用,取而代之的是“声明”。
  • 这是 bash 文档中问题的一个很好的例子,它与命令行帮助(使用“帮助”命令)和手册页不一致,(使用“man bash”并转到 SHELL BUILTINS)和内置页面(使用'man builtins')。里面还有一些错别字,请注意
  • “当在函数中使用时,declare 使每个名称都成为本地名称,就像使用本地命令一样,除非使用 -g 选项。”来自gnu.org/software/bash/manual/html_node/Bash-Builtins.html
【解决方案3】:

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

'排版'
排版 [-afFrxi] [-p] [NAME[=VALUE] ...]
提供“排版”命令是为了与 Korn 兼容 贝壳;但是,它已被弃用,取而代之的是“声明” 内置命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2022-06-16
    • 2015-07-29
    • 2012-11-28
    • 2019-07-25
    相关资源
    最近更新 更多