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

bashスクリプトの場合:

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

abc=ok 

または、declare

declare abc=ok 

違いは何ですか?

そしてなぜbashは変数を作成するためにこれほど多くの方法を作るのですか?

コメント

  • 関数で使用する場合、declareは、localコマンドと同様にNAMEをローカルにします。-gオプションはこの動作を抑制します。 help declareを参照してください。
  • declareを使用すると、連想配列、整数、読み取りを作成できます-変数のみ。また、引数を展開するため、declare $name=1などが可能です。

回答

help -m declareから:

NAME

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

SYNOPSIS

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

説明

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

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

    オプション:

      -f

        アクションまたは表示を関数名と定義に制限します

      -F

        表示を関数名のみ(およびデバッグ時の行番号とソースファイル)に制限します

      -g

        シェル関数で使用する場合はグローバル変数を作成します。それ以外の場合は無視されます

      -p

        属性と値を表示します各名前の

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

      -a

        NAMEをインデックス付き配列にする(サポートされている場合)

      -A

        NAMEを関連付け配列にする(サポートされている場合)

      -i

        NAMEに「integer」属性を持たせる

      -l

        割り当て時にNAMEを小文字に変換する

      -n

        NAMEをその値で指定された変数への参照にします

      -r

        名前を再作成するadonly

      -t

        NAMEに「 trace 属性

      -u

        割り当ての大文字

      -x

        名前を付けるエクスポート

    +

- の代わりに

は、指定された属性をオフにします。

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

いつ関数で使用されるdeclareは、localコマンドと同様に、NAMEをローカルにします。 -g オプションはこの動作を抑制します。

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

関連項目

    bash(1)

実装

    GNU bash、バージョン4.3.11(1)-リリース(i686-pc-linux-gnu)
    Copyright(C)2013 Free Software Foundation、Inc。
    ライセンスGPLv3 +:GNUGPLバージョン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は、関数、スクリプトを使用したループで役立ちます。

変数の入力:宣言またはタイプセット

コメント

  • はい、"と属性"がポイントです!これが違いです。
  • すばらしい!私は例、教える/学ぶための最良の方法が大好きです。ありがとうございます!
  • この回答を理解するには、"属性"を知っておく必要があります。 'は、' integer '、 array '、または' readonly '。
  • これはdeclareを説明するのに役立ちますが、bashを介して変数を宣言したときに何が起こるかを完全に無視します。

回答

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

bashでは、他のシェルと同様に、文字列変数と配列変数を宣言する必要がないため、declare」は必要ありません。 declare -A abcを使用してabcを連想配列にするか、declare -rを使用して変数を読み取り専用にします。ただし、関数内では、declareによって違いが生じます。つまり、変数が関数に対してローカルになります。つまり、関数外の変数の値(存在する場合)が保持されます。 。 (変数をローカルではないdeclare -gを使用する場合を除きます。これは、declare -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を。 (bashが単にtypesetと呼ばなかった理由はわかりません)。 3番目の同義語であるlocalがあります。declare -x 同じexportもあります。 / div>、これも互換性のためです(すべてのBourneスタイルのシェルと)。

コメント

  • はい! 'とオプション'がポイントです。 p.s. bashを設計する場合は、"の動作に"の動作を別の条件で実行させます。これで物事が簡単になります。
  • いい答えです。 exportlocaldeclareのいずれかが最も互換性のある質問です。他のシェル?
  • @ 0xc0de exportshのすべてのバリアントに存在します。 localはbashとzshにのみ存在し、declareはbashにのみ存在します。 typesetは、ksh、bash、zshに存在します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です