bash - 在 Bash 中,我应该使用 declare 而不是 local 和 export 吗?

标签 bash

我最近发现了 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

我已经开始在任何地方使用它并停止使用本地和导出。那么为什么 localexport 还要存在呢?

最佳答案

他们因历史而存在。 This manualdeclare 是在 bash 版本 2 中引入的,local 是较早引入的。人们按照惯例和可读性使用 localexportreadonly

当我看到 local 时,我想 - '噢!这必须是一个函数局部变量。我一定是在读一个函数。当我看到 declare 时,我需要向上滚动直到看到函数声明,以了解我是否在函数中并查看该变量是否是本地变量。

对于 exportexport 是 POSIX 内置的,所以它可以在任何地方工作,这很重要。但它是相似的。当我看到 export 时,我想 - '噢!这个变量正在导出!'。当我看到 declare -x 时,我需要用 declare 选项来刷新我的内存(好吧,这很简单,-x 听起来像 export ,但这还需要记住一件事)。我更喜欢编写 localexport。因为这是我的想法——这个变量是本地的,那个变量是导出的。

当我只使用 localexport 阅读脚本,而不使用 declare 时,我知道这是一个简单的脚本。 declare -ideclare -n 会使事情复杂化。

此外,typesetdeclare 是完全相同的同义词。所以,你也可能会问,为什么要declare,什么时候可以typeset?可能引入了 typeset,因此您可以使用 bash 运行 ksh 脚本而无需任何更改。与 localreadonly 关键字相同。类似于mapfilereadarray。习俗。对于文件,您可以使用 mapfile,但对于此处的字符串,我有时会使用 readarray,因为我正在将一些数据读入数组,而不是映射文件。

我相信 local 关键字(有点?)比 declare 更可移植。你可以读前任。 this unix.stackexchange thread了解更多信息。

关于bash - 在 Bash 中,我应该使用 declare 而不是 local 和 export 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56627534/

相关文章:

bash - 将文本插入特定行

bash - zsh 像 bash 一样迭代

linux - 寻找匹配的 `"' shell 脚本时出现意外的 EOF

bash - 从 bash 中的管道读取时“读取”不会超时

linux - 如何从 rsync 中排除两台服务器上都存在的目录?

windows - 在 linux 上运行 windows nt 的 cmd 或 bat 文件

bash - 开始时使用 echo -n 命令的有趣行为

linux - 在 shell 脚本中组合匹配的字符串和总和列

linux - Perl 系统中的嵌套引号()

bash - 调整大小/裁剪和附加 4 张图像