Bashのすべての変数はメモリに文字列として保存されますか?

Bashのすべての変数はメモリに文字列として保存されますか?

次の変数を作成するとします。

s=John
i=12345
f=3.14

これらの変数はすべてメモリに文字列として格納されていますか?それともbash別のデータ型がありますか?

答え1

バッシュ変数はタイプが指定されていない

他の多くのプログラミング言語とは異なり、Bashは変数を「タイプ」に区別しません。デフォルトでは、Bash変数は文字列ですが、状況によっては、Bashは変数の算術演算と比較を許可します。決定要因は、変数値に数値のみが含まれているかどうかです。

〜のようにもう一つの答えは次のとおりです。、種類弱い形タイピングを使用してくださいdeclare

これは、一部のプログラミング言語で使用できる非常に弱い形式の種類[1]です。

例を見てください。

declare -i number
# The script will treat subsequent occurrences of "number" as an integer.     

number=3
echo "Number = $number"     # Number = 3

number=three
echo "Number = $number"     # Number = 0
# Tries to evaluate the string "three" as an integer.

引用:

答え2

Bash には基本的に汎用スカラー変数、配列、および連想配列があります。また、スカラーは次のように整数で表すことができます。declare組み込み。スクリプトプログラマー/シェルユーザーの観点からは、文字列変数は文字列として機能し、int変数は整数として機能し、配列はその型に従って機能します。内部実装はあまり関連性がありません。


ただし、データが実際にメモリにどのように格納されるかを知りたい場合は、ソースコードを調べて、プログラムが実際に何をしているのかを理解する必要があります。

Bash 4.4では、スカラーは整数表記に関係なく文字列として格納されます。これは次のように実行できます。struct variable/ SHELL_VARtypedef 定義そして機能make_variable_value、保存のために整数を文字列に明示的に変換します。

配列はリンクリスト(array.h)と連想配列をハッシュテーブルとして使用します。その中の値は再び文字列として保存されます。配列の連結リストを選択するのは奇妙に思えるかもしれませんが、配列が希薄で、配列に含まれる要素の数に関係なく、インデックスが任意の数になる可能性があるため、このデザインの選択は理解しやすくなります。

ただし、コードには定義も含まれています。未使用union _value、整数、浮動小数点数、および文字列値を含むフィールド。コメントに「将来の保証」と表示されているため、将来のバージョンの Bash では、さまざまな種類のスカラーをデフォルト形式で保存することができます。

答え3

私の人生では、私はこれを表現する言葉をあまり見つけることができませんが、これは私がそれを理解する方法です。

Bashはコンパイラではなくインタプリタであり、すべての変数を文字列として表します。したがって、すべての努力と集中は、さまざまな拡張と一緒に提供されます。

バッシュパスみんなdeclare文字列と呼ばれる変数プロパティこの変数を制御する方法拡大する保存としてdeclare

banana=yellow              #no call to declare
declare -p banana
declare -- banana="yellow" #but declare was invoked with --

declare -i test=a          #arithmetic expansion to null/zero
declare -p test
declare -i test="0"

declare -i test2=5+4       #successful arithmetic expansion
declare -p test2
declare -i test2="9"

declare -i float=99.6      #arithmetical expansion fails due to syntax
bash: declare: 99.6: syntax error: invalid arithmetic operator (error token is ".6")

nofloat=99.9
declare -p nofloat
declare -- nofloat"99.6"   #Success because arithmetical expansion not invoked

declare -a a               #variable is marked as a placeholder to receive an array
declare -p a
declare -a a

a[3]=99                    #array elements are appended
a[4]=99
declare -p a
declare -a a=([3]="99" [4]="99") 

declare -A newmap          #same as -a but names instead of numbers
newmap[name]="A Bloke"
newmap[designation]=CFO
newmap[company]="My Company"
declare -p newmap
declare -A newmap=([company]="My Company" [name]="A Bloke" [designation]="CFO" )

そしてもちろん

declare -ia finale[1]=9+16
declare -p finale
declare -ai finale=([1]="25")

結局のところ、declare内部表現が属性フラグに変更されても、bashが見たり見たいものはすべて文字列です。

答え4

これは関係ありません。

Bash変数と対話する唯一の方法はBashを通してです。不可能変数がメモリに保存される方法の違いを確認できます。メモリを介して直接アクセスしないでください。、常に Bash に値を要求する必要があります。これにより、Bash は必要な方法で値を翻訳できます。バラより彼らのように持つ特定の方法で保存されます。

実際にはメモリに保存されない可能性があります。別の言葉。 Bashの一般的な実装がどれほどスマートかはわかりませんが、少なくとも単純な場合は変数を使用するかどうか、および/または変更して完全に最適化またはインライン化するかどうかを判断できます。

関連情報