bashスクリプトの場合:
名前を付けるだけで変数を作成します:
abc=ok
または、declare
declare abc=ok
違いは何ですか?
そしてなぜbashは変数を作成するためにこれほど多くの方法を作るのですか?
コメント
回答
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を設計する場合は、"の動作に"の動作を別の条件で実行させます。これで物事が簡単になります。
- いい答えです。
export
、local
、declare
のいずれかが最も互換性のある質問です。他のシェル? - @ 0xc0de
export
はsh
のすべてのバリアントに存在します。local
はbashとzshにのみ存在し、declare
はbashにのみ存在します。typeset
は、ksh、bash、zshに存在します。
declare
は、local
コマンドと同様にNAMEをローカルにします。-g
オプションはこの動作を抑制します。help declare
を参照してください。declare
を使用すると、連想配列、整数、読み取りを作成できます-変数のみ。また、引数を展開するため、declare $name=1
などが可能です。