我喜欢用函数组织我的代码,因为我使用函数我也喜欢使用local
变量。我尽可能使用read-only
变量,所以如果我在代码中犯了任何错误,就会很容易被注意到。
但是我长期以来一直在使用它。所以我决定写它来分享我的经验。
如何在bash函数中定义local
AND read-only
? (见下面的答案和解释)。
答案 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
定义为范围local
和readonly
。
:~$ (
> 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 -