Bash本地AND只读变量

时间:2017-07-31 07:29:31

标签: bash

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

但是我长期以来一直在使用它。所以我决定写它来分享我的经验。

如何在bash函数中定义local AND read-only? (见下面的答案和解释)。

2 个答案:

答案 0 :(得分:6)

首次尝试: 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

答案 1 :(得分:3)

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 -