簡體   English   中英

Bash 本地和只讀變量

[英]Bash local AND readonly variable

我喜歡用函數來組織我的代碼,因為我使用的是函數,所以我也喜歡使用local變量。 我盡可能多地使用read-only變量,因此如果我在代碼中犯了任何錯誤,很容易被發現。

但是我一直用錯了很長時間。 所以我決定寫它來分享我的經驗。

如何在 bash 函數中定義localread-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM