0

bash の「変数」が他の「通常の」プログラミング言語の変数と異なる理由はありますか?

それは、それらが以前のプログラムの出力によって設定されたという事実によるものですか、それともある種のリテラルテキストによって設定されなければならないという事実によるものですか。つまり、何らかのプログラムの出力または標準入力/出力を介してテキストを出力する何かによって設定されなければなりません。コンソールなど?

私は適切な語彙を使用するのに途方に暮れていますが、私が言おうとしていることを理解し、おそらく適切な言葉を使用したり、bash 変数の概念をよりよく理解できるドキュメントを指摘したりできる人なら誰でもできます。

4

2 に答える 2

3

ほとんどの言語では、変数にさまざまな種類の値を含めることができます。たとえば、Pythonでは、変数は、算術演算を実行できる数値(a-1)、分割できる配列または文字列(a[3:])、またはカスタムのネストされたオブジェクト(person.name.first_name)にすることができます。

bashでは、これを直接行うことはできません。私があなたを正しく理解しているなら、あなたはこれがなぜであるかを尋ねました。

bashで実際に同じことができない理由は2つあります。

1つ:環境変数は(従来は)単純なkey = value文字列であり、元のshはUnixプロセスモデルの上にあるかなり薄いラッパーでした。技術的および互換性の理由から、Bashは同じように機能します。すべての変数は(に基づいて)文字列であるため、実際には豊富なネストされた型を持つことはできません。

これは、呼び出すサブシェル/添え字に変数を設定できないことも意味します。親スクリプトでは変数が設定されません。これは、環境変数が機能する方法ではないためです。

2:元のshは、コードとデータを分離しませんでした。これにより、インタラクティブな操作が容易になるためです。Shは、すべての非特殊文字をリテラルとして扱いました。つまりfind / -name foo、コマンドと3つの引数の4つのリテラル文字列と見なされていました。

find / -nameBashは、「変数findの値を変数nameの否定値で割った値」を意味するということだけを判断することはできません。これは、すべてのユーザーのfindコマンドが壊れ始めることを意味するためです。これが、他の言語が行う単純な間接参照構文を使用できない理由です。

タイムスタンプ付きのファイル名の一部と同じくらい簡単に意図できるため、減算に使用することも$name-1できません。$name-1-12-2012.tar.gz

于 2013-01-29T06:52:01.493 に答える
1

私はそれがBash関数と関係があると言うでしょう。Bash関数は値を返すことはできず、ステータスコードのみを返すことができます。

したがって、Bashを使用すると、機能を持つことができます

foo ()
{
  grep bar baz
}

しかし、関数の戻り値を「保存」しようとすると

quux=$?

値ではなく、単に終了ステータスを保存しているだけです。これをJavascriptなどの言語と比較すると、関数は実際に値を返すことができます。

foo ()
{
  return document.getElementById("dog").getAttribute("cat");
}

このように保存します

quux = foo();
于 2013-01-29T05:59:34.350 に答える