ほとんどの言語では、変数にさまざまな種類の値を含めることができます。たとえば、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 / -name
Bashは、「変数findの値を変数nameの否定値で割った値」を意味するということだけを判断することはできません。これは、すべてのユーザーのfindコマンドが壊れ始めることを意味するためです。これが、他の言語が行う単純な間接参照構文を使用できない理由です。
タイムスタンプ付きのファイル名の一部と同じくらい簡単に意図できるため、減算に使用することも$name-1
できません。$name-1-12-2012.tar.gz