我最近发现了 declare
Bash 内置函数,它声明具有局部作用域的变量,也可用于导出变量甚至设置类型。
# bar an baz have local scope
foo()
{
declare bar
local baz
}
# bing and bong are both exported
declare -x bing
export bong
# i is an integer, j is read-only integer
declare -i i=0
declare -ri j=10
我已经开始在任何地方使用它并停止使用本地和导出。那么为什么 local
和 export
还要存在呢?
最佳答案
他们因历史而存在。 This manual说 declare
是在 bash
版本 2 中引入的,local
是较早引入的。人们按照惯例和可读性使用 local
、export
和 readonly
。
当我看到 local
时,我想 - '噢!这必须是一个函数局部变量。我一定是在读一个函数。当我看到 declare
时,我需要向上滚动直到看到函数声明,以了解我是否在函数中并查看该变量是否是本地变量。
对于 export
,export
是 POSIX 内置的,所以它可以在任何地方工作,这很重要。但它是相似的。当我看到 export
时,我想 - '噢!这个变量正在导出!'。当我看到 declare -x
时,我需要用 declare
选项来刷新我的内存(好吧,这很简单,-x
听起来像 export
,但这还需要记住一件事)。我更喜欢编写 local
和 export
。因为这是我的想法——这个变量是本地的,那个变量是导出的。
当我只使用 local
和 export
阅读脚本,而不使用 declare
时,我知道这是一个简单的脚本。 declare -i
或 declare -n
会使事情复杂化。
此外,typeset
和declare
是完全相同的同义词。所以,你也可能会问,为什么要declare
,什么时候可以typeset
?可能引入了 typeset
,因此您可以使用 bash
运行 ksh
脚本而无需任何更改。与 local
和 readonly
关键字相同。类似于mapfile
和readarray
。习俗。对于文件,您可以使用 mapfile
,但对于此处的字符串,我有时会使用 readarray
,因为我正在将一些数据读入数组,而不是映射文件。
我相信 local
关键字(有点?)比 declare
更可移植。你可以读前任。 this unix.stackexchange thread了解更多信息。
关于bash - 在 Bash 中,我应该使用 declare 而不是 local 和 export 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56627534/