bashでデフォルトで式を評価しないためのプログラミング言語の概念は何ですか?


8

Bashでは、変数に格納された整数値を増やすには、算術展開を明示的に使用する必要があります。

 i=1
 i=$((i+1))

さもないと

 i=1
 i=i+1

式を評価しませんi+1が、式を文字列として変数に割り当てます。

これは、式がデフォルトで評価される他のプログラミング言語と比較すると非常に不自然です。

プログラミング言語の設計または概念で、bashのそのような機能の概念または用語はありますか?

式を評価せず、デフォルトで文字列として扱うことの意味は何ですか?

この機能は、遅延評価などの評価のタイミングに関連していますか?

ありがとう。


bashはプログラミング言語だと誰が言ったのですか?いいえ、それは遅延評価によるものではありません。これは文字列の問題なしで他の言語にも存在します
Christophe

8
@bashはプログラミング言語だと誰が言ったのですか?ええと、ウィキペディアスタックオーバーフローredditウィキブックス。そして、それは私が退屈する前に名前を付けることができるものです。Javaと同じように、bashという名前を身に付けているものは、言語だけではありません。しかし、そうです、bashプログラミング言語があります。
candied_orange 2016年

回答:


15

ここには特別な概念はありません。代わりに、展開を明示的に使用しない限り、シェル内のすべてがリテラル文字列です。この設計上の決定により、リテラル値の割り当てが容易になります。これは、割り当ての主な使用例です。

varname=value

という変数は検索しませんvalueが、文字列をそのまま使用しますvalue。bashでは、+ - /etcなどのほとんどの「特殊」文字は特別なものではありません。それらは、アルファベット文字のように、文字通りの単語の一部にすぎません。

拡張構文により、テンプレート内に値を簡単に埋め込むことができます。

echo "Hello ${name}!"

(シェルでは、引用符は文字列を区切る'…'"…"区切らないことに注意してください。代わりに、適用される展開を変更します。一重引用符はすべての展開と単語分割を抑制し、二重引用符は単語分割とグロブ展開を抑制しますが、変数展開、算術展開は抑制しません(Bashのみ) 、またはコマンドの置換次の単語は等価です:。 、foo\ bar、。)foo' 'bar'foo bar'

「すべてがデフォルトで文字列である」アプローチの結果、単純な文字列だけを使用しないプログラムはより複雑になります。Bashの配列構文は、紛らわしいほどに混乱しています。算術展開はやや明白ではありません。ただし、そのようなプログラムはシェルスクリプトに最適ではありません。

推奨資料:シェルの構文とセマンティクスのPOSIXの説明:http : //pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html


7

必要に応じて、そのように機能させることができます。シェル内のすべてがリテラル文字列です。ただし、明示的に別の文字列を指定しない限り、たとえば、次は2を出力します。

typeset -i x
x=1
x=x+1
echo $x

変数が文字列ではなく整数であることをシェルに通知する必要があるだけです。変数を配列にしたい場合も同様です。


あなたが言うことは真実で役立つが、「プログラミング言語の概念とは何か[...]」である実際の質問には答えませんか?
アンドレスF.


0

ここでのコンセプトは「後方互換性」です。Bourneシェルはすべてを文字列として処理するため、bashもデフォルトで実行する必要があります。そうしないと、すべてのpre-bashスクリプトが機能しなくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.