
によるとこの郵便受けは[
組み込みで、[[
はキーワードです。これらはコマンドとみなすことができるため、 と の後のすべては[
コマンド[[
引数とみなされ、最後の引数と に出会うまでスペースで区切る必要があります]
。]]
しかし、 のタイプは何ですか((
?
type ((
エラーが発生します:
bash: syntax error near unexpected token `('.
内部ではスペースは関係ないことがわかりました(( ))
。
echo $((1+1))
echo $(( 1+1))
echo $(( 1+1 ))
echo $(( 1+ 1))
echo $(( 1 + 1 ))
すべて同じです
まとめ
によるとPOSIX 標準ドキュメント: コマンドのグループ化セクション
「((」で始まる文字シーケンスが、その前に「$」が付いている場合、シェルによって算術展開として解析される場合、「((式))」が算術式として評価される拡張機能を実装するシェルは、「((」をグループ化コマンドではなく算術評価の導入として扱う場合があります。準拠するアプリケーションは、シェルが算術評価を実行しないように、先頭の 2 つの「(」文字を空白で区切る必要があります。
内部の算術評価は((...))
Cスタイルに準拠しています。したがって、内部のスペースは関係ありません。((...))
答え1
((
は単語ではありません。[
や とは異なり[[
、コマンドを構成する単語のリストの一部ではありません。句読点と考えるのが最善です。実際は、2 つの句読点文字であり、コンテキストに応じて 1 つのトークンに結合される場合と結合されない場合があります。その点では や のようなものに似ています>&
。||
句読点文字は、シェルのレクサー/パーサーによってアドホックな方法で処理されます。
((
は演算子の半分で、もう半分は です))
。これらを組み合わせると、“外置”構文を持つ算術式演算子が作成されます。bash などのシェル言語の文法構造は、従来のプログラミング言語の構文にあまりきちんと従っていません (たとえば、句読点は文法コンテキストに依存する意味を持つため、字句解析と文法解析の間には非常に強い結びつきがあります)。そのため、必ずしもきちんと適合する単語があるわけではありません。
type
単純なコマンドに出現する可能性のある単語やキーワードに関する情報しか提供できず、シェルのレキサー/パーサーの動作に関する情報は提供できません。