bashの何が最悪なのか
- 不合理な構文: ${!…} は、「困ったらとりあえずビックリ」という方針な気がする。
- トークンと式と文とデータ(リテラル)の区別が曖昧。
- 式の評価方式がハッキリしない。
- 式の値=データもハッキリしない。
- データの実際の値をインスペクトするのが困難
- 状態や複合データに対して、列挙と存在確認が困難。
- 非存在と特殊値の区別が困難(存在確認の困難さと同じ)
- 隠れたデータ構造(ワードリスト)があり、これが挙動に影響を与える。
- リテラル表現が極めて貧弱
- 型強制(コアージョン)が不合理で、しかも多用される。配列・複合配列→文字列のコアージョンなんて最低だろう。
- ツギハギ構文。[ ] はコマンド、しかも閉じカッコは単なる引数トークン。[[ ]] はシェルキーワード、したがって区切り記号。(( )) は立場が不明。少なくとも type では不明。
- 同一構文に複数の意味:配列と連想配列がその例
- 極端に文脈依存な解釈
- テキスト処理(マクロ展開)が入っている。
- テキストが、式とデータの両方で使われて、解釈(≒マクロ展開、テンプレート展開)が何度も行われるのでワケワカラン。
- 代入文がトークン? もともとはコマンドの飾り(prefix, suffix)だったようだ。
- 展開順序が分かりにくい。x=hello echo $x の例。
- オプションにより挙動が変わる。set -f, set -u とか。set -o、shoptで山のようなオプション。
それと、変数の浅い束縛により、関数の呼び出しスタック(チェーンかも知れない)を上向きにたどる変数検索。便利とも言えるが、大規模プログラムでこれは厳しい。バグの温床になる。古いスクリプト言語はだいたいコレを使っている。動的で便利だという名目で。