私の目標は、「可変属性」の一般的な概念を理解することです。理解するのに役立つことを願っています。Bashで宣言された内容。
変数属性とは何ですか?なぜ変数に属性を割り当てたい人がいるのですか?変数を作成し、それを使用するときにすぐに拡張するだけでは「十分」ではなかったのはなぜですか?
答え1
通常、変数は値が格納される場所です。変数()に値を割り当ててから、var="some value"
変数拡張を介してその値を呼び出すことができます(書き込み"$var"
は書き込みと同じ"some value"
)。
変数に値を割り当てるときや、シェルが変数にアクセスする他の状況で、変数に特別な操作を実行させることができます。変数の属性は、シェルが変数の名前と値の横に格納するコメントで、シェルにこの特別な動作を適用するように指示します。
一例
declare -i x
x
整数値のみを含める必要があることをシェルに通知します。通常、変数に値を割り当てると、シェルは等号の右側にある拡張文字列を取得し、変数値として保存します。ただし、変数に整数属性がある場合、シェルは文字列を算術式として解析し、式の評価結果を保存します。たとえば、
$ x=2+2; echo $x
2+2
$ declare -i x; x=2+2; echo $x
4
$ declare -i x; x=2+hello; echo $x
2
$ declare -i x; x=2+
bash: 2+: syntax error: operand expected (error token is "+")
(3行目は未定義の変数名なので2にx=2+hello
設定されており、未設定の変数はデフォルトで0と解釈されます。)x
hello
その他の例
declare -l var
ステートメントにはvar
小文字のみを含める必要があります。シェルは、変数の値を保存すると、すべての大文字を小文字に変換します。declare -u var
別の方向に切り替えます。declare -r var
var
読み取り専用にしてください。これは割り当ての特別な動作でもあります。これにより、すべての後続の割り当てvar
が失敗します。declare -x var
var
環境に出力するようにしてください。この属性の場合、bash が外部コマンドを実行すると特別な動作が発生します。外部コマンドとして表示される環境には、外部コマンドの実行時にシェルからエクスポートされた変数が含まれます。
答え2
からhelp declare
:
Options which set attributes:
-a to make NAMEs indexed arrays (if supported)
-A to make NAMEs associative arrays (if supported)
-i to make NAMEs have the `integer' attribute
-l to convert the value of each NAME to lower case on assignment
-n make NAME a reference to the variable named by its value
-r to make NAMEs readonly
-t to make NAMEs have the `trace' attribute
-u to convert the value of each NAME to upper case on assignment
-x to make NAMEs export
注:declare
関数と一緒に使用することもできます。
これらの各属性は、1つ以上の目的で使用されます。
-a
- NAMEをインデックス配列にする(サポートされている場合)
パラメータを配列に設定すると、自動的にインデックス配列として宣言されるため、これは完全に必要ではありません。これにより、コードをより目立って読みやすくすることができます。
-A
- 配列に関連付けられた名前の作成(サポートされている場合)
私が知る限り、最初に宣言せずに連想配列を設定しようとするとインデックス配列が作成されるため、これは完全に必要です。
$ assoc=([foo]=bar)
$ declare -p assoc
declare -a assoc=([0]="bar")
$ unset assoc
$ declare -A assoc
$ assoc=([foo]=bar)
$ declare -p assoc
declare -A assoc=([foo]="bar" )
-i
- 名前に「整数」属性を持つように設定
パラメータが利用可能であることを確認したい場合に便利です。ただ整数を保存します。また、割り当てに対して算術拡張を実行することもできます。
$ declare -i a
$ a=foo
$ echo $a
0
$ a=1+1
$ echo $a
2
-l
- 割り当て時に各NAMEの値を小文字に変換
パラメータ値が常にすべて小文字であることを確認してください。これは以前は知りませんでしたが、今後使用できる本当に素晴らしい機能です。複雑なパラメータ拡張や別のユーティリティを使用する必要はありません。tr
$ declare -l foo=Bar
$ echo $foo
bar
-n
– NAME を値の名前付き変数への参照にします。
間接参照と同じです。これにより、eval
多くのスクリプトで使用が削除される可能性があります。
$ a=foo
$ declare -n b=a
$ echo $b
foo
-r
- 名前を読み取り専用に設定
これは素晴らしい機能です。一度設定して変更したくないシェル/環境変数に特に便利です。
$ declare -r foo=bar
$ echo $foo
bar
$ foo=baz
-bash: foo: readonly variable
-t
- NAMEに「trace」属性を持つように設定
私はこれについてよくわかりません。機能でしか機能できないと思います。
-u
- 割り当て時に各NAMEの値を大文字に変換
似ている-l
が反対
$ declare -u foo=bAr
$ echo $foo
BAR
-x
- 名前のエクスポート
変数を環境にエクスポートする別の方法です。