2017-07-31 10 views
2

関数を使用してコードを整理するのは、local変数を使用するのが好きです。可能な限り私はread-onlyの変数を使用しています。私は自分のコードの中で間違いを犯すと、簡単に気づくでしょう。Bashローカルで読み込み可能な変数

しかし私は長い間それを間違って使用してきました。だから私は自分の経験を共有するためにそれを書くことに決めました。

localread-onlyをbash関数内で定義する方法はありますか? (下記の解答と説明を見てください)。

答えて

2

初の試み:local readonly var1

私はそれを定義するために使用される方法です。違います。変数var1localと定義しますが、それは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

今回それがreadonlyとしてvar1を定義しますが、それはまた、それは、それがキーワードとしてlocalを処理しません、このようになります使用して、localという変数を定義します変数名にする。

チェックもvar1の範囲がlocalではないことを、実際には、我々は関数の外var1の値を見ることができ、globalです。


それがあるべきとおり

:~$ (
>  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

それはまさに私がやりたいだろう。この方法で、私はスコープlocalreadonlyとしてvar1を定義します。

:~$ (
>  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: 

以下のように定義することもできますが、1行は2よりも優れています。

local var1="val1" 
readonly var1 
1

、bashのmanページにはdeclareコマンドのthuslyものをまとめたものです。

-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 - 
+0

関数内の 'declare -r'と' local -r'の違いは何ですか? – Azize

+0

これらのうちの1つは、スクリプトにコマンドを格納するために、もう一方のバイトよりも2バイト少ないバイト数を使用します。ああ、もう一つは「d」で始まります。 :) – ghoti

関連する問題