次の変数を作成したとします。
s=John
i=12345
f=3.14
これらの変数はすべてメモリに文字列として保存されていますか、それともbash他のデータ型がありますか?
次の変数を作成したとします。
s=John
i=12345
f=3.14
これらの変数はすべてメモリに文字列として保存されていますか、それともbash他のデータ型がありますか?
回答:
bash変数は型指定されていません。
他の多くのプログラミング言語とは異なり、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.
参照:
Bashには基本的に、プレーンなスカラー変数、配列、および連想配列があります。さらに、declarebuiltinを使用して、スカラーを整数としてタグ付けできます。スクリプトプログラマー/シェルユーザーの観点から見ると、文字列変数は文字列として機能し、整数変数は整数として機能し、型に応じて配列が機能します。内部実装はあまり重要ではありません。
しかし、データが実際にメモリに格納される方法を知りたい場合は、ソースコードを調べて、プログラムが実際に何をするのかを確認する必要があります。
Bash 4.4では、整数タグに関係なく、スカラーは文字列として保存されます。これは、typedefの定義struct variableSHELL_VARと、整数をストレージ用の文字列に明示的に変換するfunctionmake_variable_valueで見ることができます。
配列はリンクされたリスト(array.h)に見えるものに保存され、連想配列はハッシュテーブルとして保存されます。それらの値は再び文字列として保存されます。配列のリンクリストの選択は奇妙に思えるかもしれませんが、配列がまばらになり、配列に含まれる要素の数に関係なくインデックスが任意の数になる可能性があるため、その設計の選択は少し理解しやすいです。
ただし、コードには、未使用ののunion _value定義も含まれており、整数値、浮動小数点数、文字列値のフィールドがあります。コメントには「for the future」とマークされているため、Bashの将来のバージョンでは、さまざまなタイプのスカラーがネイティブ形式で格納される可能性があります。
私の人生にとって、これは多くの言葉でどこにも述べられていませんが、これは私がそれを理解する方法です。
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が見るか、見たい文字列だけであるということです。
無関係です。
それがあるので、バッシュ変数と対話する唯一の方法は、バッシュていることは不可能あなたは、変数がメモリに格納されている方法などの違いに気づくことのためにあなたがすることができますので、直接メモリを介してそれらにアクセスすることはありません、あなたは常に自分のためにバッシュを依頼する必要がありますそして、Bashは、特定の方法で保存されているかのように、見た目を自由に変換できます。
実際、メモリに保存されることさえありません。Bashの一般的な実装がどれほど賢いかはわかりませんが、少なくとも単純な場合には、変数を使用するか、変更するか、またはその両方を決定し、完全に最適化するかインライン化することは可能です。
bash)。