bash - 局部变量赋值 return 可以为假吗?

bash - Can local variable assignment return false?

假设我有以下代码,其中 is_wednesday 是一个 return 在星期三为 0 而在其他日期为 1 的函数。

print_wednesday() {
    is_wednesday && local WEDNESDAY="Yes!" || local WEDNESDAY="No!"
    echo "Is today Wednesday? $WEDNESDAY"
}

有没有一种方法可以为局部变量赋值 return 1,在这个例子中会导致在星期三打印 Is today Wednesday? No!

Can local variable assignment return false?

内置的 local 将:

  • return 2 当用 --help
  • 调用时
  • return 2 调用无效时 -flags.
  • return 1 如果不是在函数内部调用
  • return 0 否则
  • (或者整个 Bash 进程将终止,以防出现类似“内存不足”的错误)

请注意,变量赋值(我的意思是,没有 local)将 return 最后执行的进程的退出状态。以下将打印 No:

true && WEDNESDAY="Yes$(false)" || WEDNESDAY="No"
echo "$WEDNESDAY"

Is there a way that assigning a value to a local variable would return 1, which in this example would result in printing Is today Wednesday? No! on a Wednesday?

没有


我会推荐:

  • local与作业分开
  • 不要使用 && || 链,总是使用 if.
  • 局部变量不要使用大写变量。
  • 并按以下方式编写函数:

print_wednesday() {
    local wednesday
    if is_wednesday; then
         wednesday="Yes"
    else
         wednesday="No"
    fi
    echo "Is today Wednesday? $wednesday!"
}

是的,一个(简单的、语法正确的)局部变量赋值可以 return false。特别是,如果变量已经在代码的其他地方声明为 readonly,或者在函数外部用 declare -r 声明,就会发生这种情况。这个 Shellcheck-clean 程序演示了这个问题:

#! /bin/bash -p

readonly WEDNESDAY='No!'

function test_local_return_value
{
    local WEDNESDAY='Yes!'
    echo "'local' returned $?"
    echo "WEDNESDAY='$WEDNESDAY'"
}

test_local_return_value

输出如下:

...: line 7: local: WEDNESDAY: readonly variable
'local' returned 1
WEDNESDAY='No!'

这是 local 的严重限制,因为这意味着程序中其他地方的更改可能会破坏看似完全独立的功能。我在实践中看到过这种情况。 readonly 创建一个全局只读变量,即使它在函数中使用,这一事实使问题变得更糟。 readonly 需要非常小心地使用。它不应该在函数中使用(使用 local -r 代替)并且最好有一个命名约定来确保 readonly 变量名称不会与其他变量名称冲突。

readonly 问题包含在 Bash man 页面中(至少对于 Bash 版本 4.4)。 local 部分包括:“return 状态为 0,除非 local 在函数外部使用,提供的名称无效,或者名称是只读变量”。