Bash 局部变量作用域最佳实践

Bash local variable scope best practice

我看到有些人在编写 bash 脚本时会在 if else 语句中定义局部变量,例如示例 1

示例 1:

#!/bin/bash

function ok() {
  local animal

  if [ ${A} ]; then
     animal="zebra"
  fi

echo "$animal"
}

A=true
ok

再举个例子,这个也是一样的:

示例 2:

#!/bin/bash
function ok() {

  if [ ${A} ]; then
     local animal
     animal="zebra"
  fi

echo "$animal"
}

A=true
ok

因此,上面的示例打印了相同的结果,但最好遵循哪一个。我更喜欢示例 2,但我看到很多人像示例 1 一样在函数内声明局部变量。像下面这样在顶部声明所有局部变量会更好吗:

function ok() {
 # all local variable declaration must be here
 
 # Next statement
 
}

the best practice to follow

使用 https://shellcheck.net 检查您的脚本。

引用变量扩展。不要$var,做"$var"https://mywiki.wooledge.org/Quotes

脚本局部变量更喜欢使用小写变量A=true。更喜欢为导出的变量使用大写和非常独特的名称。

不要使用 function name()。使用 name()https://wiki.bash-hackers.org/scripting/obsolete

记录全局变量的用法a=true。或者在使用变量 local a; 然后 a=true 之前添加本地。 https://google.github.io/styleguide/shellguide.html#s4.2-function-comments

scope best practice

通常,使用尽可能小的范围。让东西彼此靠近。将 local 放在变量用法附近。 (这类似于 C 或 C++ 到 define a variable close to its usage 的规则,但与 C 或 C++ 不同的是,在 shell 中,声明和赋值应该在不同的行上)。

注意你的例子不一样。在变量A(或a)为空字符串的情况下,第一个版本将打印一个空行(本地animal变量为空),第二个版本将打印值全局变量 animal(没有 local)。虽然范围应该是最小的,但是 animalif 之外使用 - 所以 local 也应该在外面。

局部命令约束声明到函数作用域的变量.

话虽如此,您可以推断在 if 块内执行此操作与在其外部执行此操作一样,只要它在函数内部即可。