関数を使用してコードを整理するのは、local
変数を使用するのが好きです。可能な限り私はread-only
の変数を使用しています。私は自分のコードの中で間違いを犯すと、簡単に気づくでしょう。Bashローカルで読み込み可能な変数
しかし私は長い間それを間違って使用してきました。だから私は自分の経験を共有するためにそれを書くことに決めました。
local
とread-only
をbash関数内で定義する方法はありますか? (下記の解答と説明を見てください)。
関数を使用してコードを整理するのは、local
変数を使用するのが好きです。可能な限り私はread-only
の変数を使用しています。私は自分のコードの中で間違いを犯すと、簡単に気づくでしょう。Bashローカルで読み込み可能な変数
しかし私は長い間それを間違って使用してきました。だから私は自分の経験を共有するためにそれを書くことに決めました。
local
とread-only
をbash関数内で定義する方法はありますか? (下記の解答と説明を見てください)。
初の試み: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
今回それが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
それはまさに私がやりたいだろう。この方法で、私はスコープlocal
とreadonly
として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
、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 -
関数内の 'declare -r'と' local -r'の違いは何ですか? – Azize
これらのうちの1つは、スクリプトにコマンドを格納するために、もう一方のバイトよりも2バイト少ないバイト数を使用します。ああ、もう一つは「d」で始まります。 :) – ghoti