bashスクリプトでは、declareと通常の変数の違いは何ですか?


43

bashスクリプトの場合:

変数に名前を付けるだけで変数を作成します。

abc=ok

または私たちは使用できます declare

declare abc=ok

違いは何ですか?

そして、なぜbashは変数を作成するために非常に多くの方法を作るのですか?


6
関数で使用する場合declarelocalコマンドと同様に、NAMEをローカルにします。-gオプションは、この動作を抑制することができます。をご覧くださいhelp declare
サイラス

2
declare連想配列、整数、読み取り専用変数を作成できます。また、引数を拡張するため、次のようなことdeclare $name=1が可能です。
チョロバ

回答:


34

からhelp -m declare

名前

    declare -変数の値と属性を設定します。

あらすじ

    declare[ -aAfFgilnrtux] [ -p] [ name[ ] ...]=value

説明

    変数の値と属性を設定します。

    変数を宣言し、それらに属性を与えます。NAMEが指定されていない場合、すべての変数の属性と値を表示します。

    オプション:

      -f
        アクションまたは表示を関数名と定義に制限する
      -F
        表示を関数名のみに制限します(デバッグ時に行番号とソースファイルに加えて)
      -g
        シェル関数で使用される場合、グローバル変数を作成します。それ以外の場合は無視されます
      -p
        各NAMEの属性と値を表示する

    属性を設定するオプション:

      -a
        NAMEにインデックス付き配列を作成する(サポートされている場合)
      -A
        NAMEを連想配列にする(サポートされている場合)
      -i
        NAMEに「整数」属性を持たせるため
      -l
        NAMEを割り当て時に小文字に変換する
      -n
        NAMEをその値で指定された変数への参照にします
      -r
        NAMEを読み取り専用にする
      -t
        NAMEに「トレース」属性を持たせるため
      -u
        NAMEを割り当て時に大文字に変換する
      -x
        NAMEをエクスポートするには

    ' +'の代わりに ' -' を使用すると、指定された属性がオフになります。

    整数属性を持つlet変数には、変数に値が割り当てられたときに算術評価(コマンドを参照)が実行されます。

    関数で使用する場合declarelocal コマンドと同様に、NAMEをローカルにします。' -g'オプションは、この動作を抑制します。

    終了ステータス:
    無効なオプションが指定されるか、変数割り当てエラーが発生しない限り、成功を返します。

参照

    bash(1)

実装

    GNU bash、バージョン4.3.11(1)-release(i686-pc-linux-gnu)
    Copyright(C)2013 Free Software Foundation、Inc.
    ライセンスGPLv3 +:GNU GPLバージョン3以降<http://gnu.org/ licenses / gpl.html>


そのため、declare変数値と属性の設定に使用されます

非常に簡単な例で、2つの属性の使用を示しましょう。

$ # First Example:
$ declare -r abc=ok
$ echo $abc
ok
$ abc=not-ok
bash: abc: readonly variable


$ # Second Example:
$ declare -i x=10
$ echo $x
10
$ x=ok
$ echo $x
0
$ x=15
$ echo $x
15
$ x=15+5
$ echo $x
20

上記の例から、declare通常の変数に対する変数の使用法を理解する必要があると思います!このタイプのdeclare関数は、関数、スクリプトを使用したループで役立ちます。

タイピング変数もご覧ください:declareまたはtypeset


はい、「および属性」がポイントです!これが違いです。
-lovespring

すばらしいです!私は例、教える/学ぶための最良の方法が大好きです。ありがとう!
-turkenh

1
この答えを理解するには、「属性」が何であるかを知る必要があります。これらは、「整数」、「配列」、「読み取り専用」などの変数のプロパティです。
ヌメノン

11

abc=ok変数に値を割り当てますabcdeclare abcという変数を宣言しますabc。2つはとして組み合わせることができますdeclare abc=ok

bashでは、他のシェルと同様に、文字列変数と配列変数を宣言する必要はありません。したがってdeclare、たとえば連想配列を作成したり、変数を読み取り専用にしたりdeclare -A abcするオプションを渡す場合を除き、必要ありません。ただし、関数内では違いがあります。変数が関数に対してローカルになります。つまり、関数外の変数の値(存在する場合)が保持されます。(変数をローカルにしないを使用しない限り、これは他のオプションと組み合わせた場合に便利です。たとえば、関数内にグローバル連想配列を作成する場合などです。)例:abcdeclare -rdeclaredeclare -gdeclare -gA

f () {
  declare a
  a='a in f'
  b='b in f'
  echo "From f: a is $a"
  echo "From f: b is $b"
}
a='Initial a'
b='Initial b'
f
echo "After f: a is $a"
echo "After f: b is $b"

出力:

From f: a is a in f
From f: b is b in f
After f: a is Initial a
After f: b is b in f

あなたがdeclare組み込みでできるもう一つのことは

declare組み込みは、bashのに固有のものです。それは強く刺激され、kshのtypeset組み込みに非常に近く、bashは互換性のtypeset同義語として提供されdeclareます。(bashが単にそれを呼び出さなかった理由がわかりませんtypeset)。3番目の同義語がありlocalます。また、互換性のためにexport、と同じdeclare -xです(すべてのBourneスタイルのシェルと)。


はい!「オプション」がポイントです。ps bashを設計する場合、「宣言」の動作に異なる条件で何かをさせます。これは物事を簡単にします。
-lovespring

素敵な答え。さらに、問題、1の中でexportlocalおよびdeclare他のシェルと最も互換性がありますか?
0xc0de

1
@ 0xc0de exportは、のすべてのバリアントに存在しますshlocalbashとzshにdeclareのみ存在し、bashにのみ存在します。typesetksh、bash、zshに存在します。
ジル「SO-悪であるのをやめる」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.