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


13

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

s=John
i=12345
f=3.14

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


1
興味がないだけで、なぜそれが重要なのでしょうか?言語の機能に影響を与えない限り、それらがスワヒリ語のテキストとして保存されているかどうかは本当に気にしませんでしたbash)。

2
@paxdiablo私は知っている他のすべてのプログラミング/スクリプト言語(たとえば、Java、C ++、JavaScript、PHPなど)が各データ型に対して一意のメモリ表現を持っているので、問題ではありません。 、したがって、すべてのデータ型に対して1つのメモリ表現しか持たないスクリプト言語を見るのは興味深いことです。
user268325

回答:


16

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.

参照:


13

Bashには基本的に、プレーンなスカラー変数、配列、および連想配列があります。さらに、declarebuiltinを使用して、スカラーを整数としてタグ付けできます。スクリプトプログラマー/シェルユーザーの観点から見ると、文字列変数は文字列として機能し、整数変数は整数として機能し、型に応じて配列が機能します。内部実装はあまり重要ではありません。


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

Bash 4.4では、整数タグに関係なく、スカラーは文字列として保存されます。これはtypedefの定義struct variableSHELL_VARと、整数をストレージ用の文字列に明示的に変換するfunctionmake_variable_valueで見ることができます。

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

ただし、コードには、未使用ののunion _value定義も含まれており、整数値、浮動小数点数、文字列値のフィールドがあります。コメントには「for the future」とマークされているため、Bashの将来のバージョンでは、さまざまなタイプのスカラーがネイティブ形式で格納される可能性があります。


1

私の人生にとって、これは多くの言葉でどこにも述べられていませんが、これは私がそれを理解する方法です。

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が見るか、見たい文字列だけであるということです。


0

このページには、 Bashでの変数の入力に関する包括的なガイドがあります。このセクションには、declare組み込みコマンドの詳細が記載されています。そのリンクからのこのコードスニペットは興味深いかもしれません:

[bob in ~] declare -i VARIABLE=12

[bob in ~] VARIABLE=string

[bob in ~] echo $VARIABLE
0

[bob in ~] declare -p VARIABLE
declare -i VARIABLE="0"

こちらがのmanページですdeclare


0

無関係です。

それがあるので、バッシュ変数と対話する唯一の方法は、バッシュていることは不可能あなたは、変数がメモリに格納されている方法などの違いに気づくことのためにあなたがすることができますので、直接メモリを介してそれらにアクセスすることはありません、あなたは常に自分のためにバッシュを依頼する必要がありますそして、Bashは、特定の方法で保存されいるかのように、見た目を自由に変換できます。

実際、メモリ保存されることさえありません。Bashの一般的な実装がどれほど賢いかはわかりませんが、少なくとも単純な場合には、変数を使用するか、変更するか、またはその両方を決定し、完全に最適化するかインライン化することは可能です。


質問のポイントは場所
-bu5hman

2
私のポイントは、あなたそれを観察できないので、あなたが表現を知ることができないということです。したがって、それは無関係であり、気付かないうちに変化する可能性があります。Bashがどの表現を選択するかを伝えることは、単に不可能です。実装のソースコードを掘り下げて、どの表現を選択するかを確認できますが、次のパッチリリースで明日表現を変更する可能性があり、知る方法はありません。
ヨルグWミットタグ

シュレーディンガー変数?根本的な表現が無関係であることについては基本的に同意しますが(私の答えを参照)、bashを使用することで効果的に「インターフェイスへのコーディング」を行い、インターフェイスでの表現は文字通りです。
bu5hman

2
はい。ただし、問題はインターフェイスの境界での表現ではなく、具体的にどのように「メモリに格納される」かです。そして、その質問に答えます。私たちは知らない、できない、知らないはずです。
ヨルグWミッターグ

これは私自身の投稿の最後の行を言い換えています.....私が言ったように、私たちは同意します......そしてOPの担当者と質問の性質を考えると、彼らは誰でも彼らの宿題のために合理的なマークを与えられると思います引用符で囲まれます;-)。
bu5hman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.