Bash 局部 AND 只读变量



我喜欢用函数组织我的代码,因为我正在使用函数,我也喜欢使用local变量。我尽可能多地使用read-only变量,所以如果我在代码中犯了任何错误,它很容易被注意到。

但是我已经错误地使用了很长时间。所以我决定写它来分享我的经验。

如何在 bash 函数中定义localANDread-only?(请参阅下面的答案和解释(。

第一次尝试:local readonly var1

这就是我过去定义它的方式。这是错误的。我将我的变量var1定义为local,但它不会readonly,正如您在下面的示例中看到的那样,我可以更改var1的值,但我不希望这样!

:~$ (
>     myfunction()
>     {
>         # Define variable
>         local readonly var1="val1"
>         
>         echo "Readonly output:"
>         readonly | grep -E 'readonly|local|var1'
>         echo ""
> 
>         echo "Local output:"
>         local | grep -E 'readonly|local|var1'
>         echo ""
> 
>         var1="val2"
>         echo "VAR1 INSIDE: ${var1}"
>     }
>     myfunction
>     echo "VAR1 OUTSIDE: ${var1}"
> )
Readonly output:
Local output:
var1=val1
VAR1 INSIDE: val2
VAR1 OUTSIDE:

第二次尝试:readonly local var1

这次它将var1定义为readonly,但它也会定义一个名为local的变量,因此使用这种方式它不会将local作为关键字处理,它将是一个变量名称。

还要检查var1的作用域是否local,其实是global,我们可以看到函数外var1的值。

:~$ (
>     myfunction()
>     {
>         # Define variable
>         readonly local var1="val1"
>         
>         echo "Readonly output:"
>         readonly | grep -E 'readonly|local|var1'
>         echo ""
> 
>         echo "Local output:"
>         local | grep -E 'readonly|local|var1'
>         echo ""
> 
>         echo "VAR1 INSIDE: ${var1}"
>     }
>     myfunction
>     echo "VAR1 OUTSIDE: ${var1}"
> )
Readonly output:
declare -r local
declare -r var1="val1"
Local output:
VAR1 INSIDE: val1
VAR1 OUTSIDE: val1

应该是:local -r var1

这样它将完全按照我的意愿,它将var1定义为范围localreadonly

:~$ (
>     myfunction()
>     {
>         # Define variable
>         local -r var1="val1"
>         
>         echo "Readonly output:"
>         readonly | grep -E 'readonly|local|var1'
>         echo ""
> 
>         echo "Local output:"
>         local | grep -E 'readonly|local|var1'
>         echo ""
> 
>         #var1="val2"
>         echo "VAR1 INSIDE: ${var1}"
>     }
>     myfunction
>     echo "VAR1 OUTSIDE: ${var1}"
> )
Readonly output:
declare -r var1="val1"
Local output:
var1=val1
VAR1 INSIDE: val1
VAR1 OUTSIDE: 

我们也可以将其定义为下面,但一行总比两行好!

local var1="val1"
readonly var1

bash 手册页这样总结declare命令的内容:

-r   Make names readonly.  These names cannot then be assigned values
by subsequent assignment statements or unset.

When used in a function, declare and typeset make each name local, as with
the local command, unless the -g option is supplied.

因此,如果您在函数中declare,则默认情况下,您声明的变量将是局部变量。如果您使用-r选项,它将是只读的。

$ cat testv
#!/usr/bin/env bash
test1() {
declare -r var="$1"
var="bacon"
}
s=foo
test1 bar
echo "$s - $var"
$ bash testv
testv: line 5: var: readonly variable
foo -

最新更新