[英]Bash local AND readonly variable
我喜歡用函數來組織我的代碼,因為我使用的是函數,所以我也喜歡使用local
變量。 我盡可能多地使用read-only
變量,因此如果我在代碼中犯了任何錯誤,很容易被發現。
但是我一直用錯了很長時間。 所以我決定寫它來分享我的經驗。
如何在 bash 函數中定義local
和read-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
定義為范圍local
AND 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
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 -
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.