Bash 中声明、排版和局部变量之间的区别

问题描述 投票:0回答:4

在 Bash 中输入变量时,

declare
typeset
有什么区别?在函数内部使用时:
declare
typeset
local
之间有什么区别?

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

更新:在问题中添加了

local

bash shell variables scope declare
4个回答
41
投票
  • typeset
    declare
    之间的区别:

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

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

前者暗示着后者,但更强大。例如,

declare -i x
使
x
具有
integer
属性,
declare -r x
使
x
只读,等等


16
投票

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

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

我还发现了这个小花絮,它进一步证实了我的主张以及你提到的

ksh
可移植性。

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


7
投票

在 Bash 手册中的 4.2 Bash 内置命令 一节中指出:

‘排版’
排版 [-afFrxi] [-p] [名称[=值] ...]
提供“typeset”命令是为了与 Korn 兼容 壳;然而,它已被弃用,取而代之的是“声明” 内置命令。


0
投票

“提供‘typeset’命令是为了与 Korn shell 兼容。它是‘declare’内置命令的同义词。” ---- 参考号。

info "bash" "typeset"

© www.soinside.com 2019 - 2024. All rights reserved.